引用されたワイルドカードを解釈する方法

引用されたワイルドカードを解釈する方法

シェルスクリプトの作成中に引用されたワイルドカードを解釈する必要があります。

"R Programming*"

*私はアスタリスクを文字通り受け入れたくありません。ワイルドカードとして解釈したいと思います。

"R Programming"*

sedコマンドを使用して最初のものを2番目に変換できますか?私はそれが任意の文字列で動作したいと思います。

答え1

を含むシェル変数があり、現在の作業ディレクトリからinで始まるファイル名R programming*に拡張する場合は、リクエストを使用して拡張をパターンとして処理し、ワイルドカード結果を実行できます。R programmingzsh$~string

string="R programming*"
print -rC1 -- $~string

(またはprint -rC1 -- $~string(N)一致するファイルがない場合、エラーの代わりに出力は表示されません。)

Inbashおよび他のすべてのBourne様シェルワイルドカードは、デフォルトでは引用符なしの引数拡張(!)と単語の区切りで行われます。ここで、空白文字は後者を実行するデフォルト値なので、$IFSワイルドカードを実行する前に合計R programming*に分割されますR。これを防ぐためにprogramming*値を変更できます。$IFS

string="R programming*"
IFS=
shopt -s failglob
printf '%s\n' $string

または、一致するファイルがない場合、出力はありません。

string="R programming*"
println() {
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}
shopt -u failglob
shopt -s nullglob
IFS=
println $string

POSIX shでは、

string="R programming*"
IFS=
printf '%s\n' $string

一致するファイルがない場合は、R programming*出力として表示されます(文字通り呼び出された単一のファイルがあるかのように)。これはBourneシェルから継承されたバグ機能であり、sまたはそれに対応する標準はR programming*ありません。bashfailglobnullglob

関連情報