我有这些文件:
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),而且为什么它给了我两次?
答案1
您使用的正则表达式dd*
, 在 shell 中根本没有被引用。这意味着 shell 将使用它作为文件名通配模式,并将其扩展为所有匹配的文件名(dd1
、dd2
和dd3
)。
因此,该命令将是
grep -E dd1 dd2 dd3 dd1 dd2 dd3
这与跨文件、、、和 的grep
模式一起运行。您从文件中得到两行,因为有一行与表达式匹配,但该文件在文件列表中出现了两次。dd1
dd2
dd3
dd1
dd2
dd3
dd3
要将模式提供给grep
shell 未扩展的部分,请引用它:
grep 'dd*' dd1 dd2 dd3
或者,等价地,
grep -E 'd+' dd[123]
答案2
您需要引用您的模式,否则它将被 shell 扩展。
dd*
扩展到dd1 dd2 dd3
所以你实际上运行:
grep -E dd1 dd2 dd3 dd1 dd2 dd3
你要
grep -E 'dd*' dd1 dd2 dd3
但是要获得带有 a 的每一行d
,您可以运行:
grep -F 'd' dd1 dd2 dd3