たとえばファイルを読み取るときに、シェルでor
の選択肢を拡張することは可能ですか?.
つまり、たとえば、grep
は_(A|B)
_のような構文をサポートしており、ファイル内のAまたはBに一致します。
同様に、これらのファイルがある場合:
_file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
_
bash
で_cat file{1..5}.txt
_を実行すると、範囲が拡張されます。いくつかのファイルに対してこれを行う同等の方法はありますか?
例えば。 cat file(1|5).txt
そして、それら2つだけを出力しますか?
一致する標準のファイル名グロビングパターン数字は_[0-9]
_です。これは1桁に一致します。
_cat file[0-9].txt
_
これらのうち2つだけを選択するには:
_cat file[25].txt
_
9より大きい数値の場合、ブレース展開が役立ちます(ただし、グロビングパターンとブレース展開の違いについては、以下の注を参照してください)。
_cat file{25..60}.txt
_
繰り返しますが、ブレースの展開では、個々の数値も使用できます。
_cat file{12,45,900,xyz}.txt
_
(上記の例では、ブレース展開は算術ループを含まず、指定された文字列に基づいて名前を生成するだけです)。
bash
では、extglob
シェルオプションを有効にして(_shopt -s extglob
_)、以下も機能します。
_cat file@(12|45|490|foo).txt
_
@(...)
パターンは、含まれている_|
_区切りのパターンのいずれかに一致します。
_[...]
_と@(...)
のような展開パターンとブレース展開の違いは、ブレース展開がコマンドラインで生成であり、実際の既存の名前と一致しない場合があることです。現在のディレクトリ。ファイル名のグロビングパターンは名前と一致しますが、可能な名前がすべて存在しない場合でも、シェルは文句を言いません。 no一致する名前が存在する場合、nullglob
Shellオプションも設定されていない限り、パターンは展開されずに残ります。この場合、パターンは削除されます。
例:
_touch file1
ls file[0-9]
_
ここでは、_file1
_のファイルリストのみが表示されます。
_ls file{0..9}
_を使用すると、ls
は_file0
_、_file2
_などが見つからないことを報告します。
次の例では、最初のコマンドは指定されたパターンに一致する既存の名前のみを操作し、2行目はまだ存在しないファイルを作成します。
_touch file[0-9]
touch file{0..9}
_
使用する構文はfile{1,2}
で、file1
およびfile2
に評価されます。
$ ls
$ touch file{1,2,3,4,5,6,7,8,9}
$ ls
file1 file2 file3 file4 file5 file6 file7 file8 file9
Inianが以下でも指摘しているように、この例の場合、touch file{1..9}
を実行する方が簡単です...
$ ls
$ touch file{1..9}
$ ls
file1 file2 file3 file4 file5 file6 file7 file8 file9
次のような複数の式を使用することもできます。
$ ls
$ touch file{1..9}{a..z}
$ ls
file1a file1b file1c
[...]
file9x file9y file9z
はい、上記は234(9
回26
)ファイルを作成します。
はい、bash
シェルでブレース展開を使用できます。いくつかのファイルについては、file{1..2}
またはfile{1,2}
を実行します
または、ファイルが存在しないことが心配な場合は、単純なループを実行します。
for file in file{1..4}.txt; do
[ -f "$file" ] || continue
echo "$file" # Do other actions on file here
done
または、単に連結することがファイルに対する唯一の操作であり、不明の場合、どの時点でも存在しなかったファイルは、それらをcat
にしてエラーを抑制します。標準エラーを/dev/null
にリダイレクトすると、ファイルが利用できない場合にエラーが抑制されます。
cat file{1,5}.txt 2>/dev/null
または、ファイルが見つからなかった場合にエラーについて文句を言わないglob式file[15]
を使用します。
cat file[15].txt