テキストファイルに次のテキストがあります
$ cat test
20180618:
20180619:
20180620:
20180621:
20180622:
20180623:
20180624:
grepを使用して、次のように数値の範囲を見つけようとします。
$ grep 201806{19..21} test
grep: 20180619: No such file or directory
grep: 20180620: No such file or directory
grep: 20180621: No such file or directory
ZSHとbashの両方で上記のエラーが発生します。 grepが文字列をファイルとして検索しているようです。
私は別の方法を試しました。
$ grep 201806* test
zsh: no matches found: 201806*
ZSHでのみこのエラーが発生します。 ZSHでこれを使用する正しい方法は何であり*
、数値範囲に対してgrepにgrepを指示するにはどうすればよいですか?
ベストアンサー1
ええ、grep
それを治療してください。最初デフォルトでは、パラメータは正規表現として使用されます。
これは意味する
grep {1..9} file
次に展開
grep 1 2 3 4 5 6 7 8 9 file
grep
withは1
他のオペランドと一致する式で呼び出され、これらの他のオペランドはファイル名になると予想されます。
その他のコマンド:
grep 201806* test
これは201806*
ファイル名のワイルドカードパターンで一致しようとします。201806
現在のディレクトリに次の名前で始まるファイルがないため、zsh
シェルはパターンを拡張できず、エラーメッセージを表示しますno matches found
。
Bourneなどの他のシェルでは、パターンがファイル名と一致しない場合は拡張されずに使用されますgrep
。式が201806*
正規表現として扱われると、一致の20180
後にゼロ個以上の6
文字が続きます2018066666
。
代わりに、範囲に一致する正規表現を設定できます。
grep -E '201806(19|20|21)' test
または
grep -E '201806(19|2[01])' test
式の(シフト)を理解する必要があります-E
(この交互にすると拡張正規表現になります)grep
。|
中かっこ拡張を使用して正規表現を構成することもできます。
set -- {19..21}
re=$( IFS='|'; printf '201806(%s)' "$*" )
grep -E "$re" test
これにより、まず位置パラメータと値が範囲内の目的の数値$1
に設定されます。これにより、変数はで区切られた数字で置き換えられる位置に設定されます。$2
$3
re
201806(%s)
printf
%s
|
この呼び出しは正規表現grep
として使用されます。201806(19|20|21)