次のファイルがあります。
DD1含む:
ok
stanley
DD2含む:
ouddd
eddi
DD3含む:
hello
dd1
私はコマンドを使用しました
$ grep -E dd* dd1 dd2 dd3
文字dを含むすべての行を取得したいです。だから私は得ることができることを願っています
dd2: ouddd
dd2: eddi
dd3: dd1
しかし、私は得た。
dd3:dd1
dd3:dd1
なぜ最後の項目(dd3:dd1)だけを受け取るのか、なぜ2回与えるのか理解できません。
答え1
使用した正規表現はdd*
シェルからまったく引用されません。これは、シェルがそれをファイル名ワイルドカードパターンとして使用し、一致するすべてのファイル名(dd1
、dd2
および)に拡張することを意味しますdd3
。
だからコマンドは次のようになります
grep -E dd1 dd2 dd3 dd1 dd2 dd3
これはファイル、、、およびのgrep
パターンとして機能します。 1行は式と一致するため、ファイルから2行が取得されますが、ファイルリストにはファイルが2回表示されます。dd1
dd2
dd3
dd1
dd2
dd3
dd3
grep
パターンの拡張されていない部分をシェルに提供するには、次のように引用します。
grep 'dd*' dd1 dd2 dd3
または等しく、
grep -E 'd+' dd[123]
答え2
パターンを引用する必要があります。それ以外の場合は、シェルによって拡張されます。
dd*
次に展開dd1 dd2 dd3
したがって、実際には次のように実行します。
grep -E dd1 dd2 dd3 dd1 dd2 dd3
欲しい
grep -E 'dd*' dd1 dd2 dd3
ただし、すべての行を取得するには、次のようにd
実行できます。
grep -F 'd' dd1 dd2 dd3