grep 返回 "<regular expression>" 没有那个文件或目录

Cpp*_*ner 1 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
Run Code Online (Sandbox Code Playgroud)

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

这是ls

user@host:/tmp# ls
f1.txt  f2.txt  f3.txt  f4.txt  
Run Code Online (Sandbox Code Playgroud)

Ben*_* W. 5

grep 的用法是

grep [OPTION]... PATTERN [FILE]...
Run Code Online (Sandbox Code Playgroud)

您的命令扩展为

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

这相当于

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

即“将文件f1.txt用作包含模式的文件,并搜索文件f2.txtf3.txtf4.txt(\d{3})-\d{3}-\d{3}。应用选项-l-v以及-E任何地方。”

也许你的意思是

grep -l -v -E "(\d{3})-\d{3}-\d{3}" *.txt
Run Code Online (Sandbox Code Playgroud)

反而?

手册页相关部分内容如下:

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

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

grep -P '\(\d{3}\)-\d{3}-\d{3}'
Run Code Online (Sandbox Code Playgroud)

或者

grep -E '\([[:digit:]]{3}\)-[[:digit:]]{3}-[[:digit:]]{3}'
Run Code Online (Sandbox Code Playgroud)