テキストファイルのgrep番号範囲

テキストファイルのgrep番号範囲

テキストファイルに次のテキストがあります

$ 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

grepwithは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$3re201806(%s)printf%s|

この呼び出しは正規表現grepとして使用されます。201806(19|20|21)

おすすめ記事