grep返回&#34; <regular expression =“”>&#34;没有这样的文件或目录

时间:2017-11-16 17:57:06

标签: regex shell grep quoting

我有以下正则表达式来匹配电话号码。正则表达式有效(123)123-123,但我对最后的结果感到困惑。

user@host: grep -l -v -f *.txt -E "(\d{3})-\d{3}-\d{3}"
f2.txt
f3.txt
f4.txt
grep: (\d{3})-\d{3}-\d{3}: No such file or directory

为什么grep正在搜索正则表达式?

以下是ls

user@host:/tmp# ls
f1.txt  f2.txt  f3.txt  f4.txt  

1 个答案:

答案 0 :(得分:4)

grep用法是

grep [OPTION]... PATTERN [FILE]...

您的命令扩展为

grep -l -v -f f1.txt f2.txt f3.txt f4.txt -E "(\d{3})-\d{3}-\d{3}"

相当于

grep -f f1.txt -l -v -E f2.txt f3.txt f4.txt "(\d{3})-\d{3}-\d{3}"

&#34;使用文件f1.txt作为包含模式的文件,并搜索文件f2.txtf3.txtf4.txt(\d{3})-\d{3}-\d{3} 。在任何地方应用选项-l-v-E。&#34;

也许你的意思

grep -l -v -E "(\d{3})-\d{3}-\d{3}" *.txt

代替?

relevant part of the man page内容如下:

  

-f FILE--file=FILE
  从 FILE 获取模式,每行一个。如果多次使用此选项或与-e--regexp)选项结合使用,请搜索给定的所有模式。空文件包含零模式,因此不匹配任何内容。

旁注:如果使用-E,则必须使用字面括号。此外,据我所知,\d不受支持,因此您必须使用

grep -P '\(\d{3}\)-\d{3}-\d{3}'

grep -E '\([[:digit:]]{3}\)-[[:digit:]]{3}-[[:digit:]]{3}'