我有以下正则表达式来匹配电话号码。正则表达式有效(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
答案 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}"
"使用文件f1.txt
作为包含模式的文件,并搜索文件f2.txt
,f3.txt
,f4.txt
和(\d{3})-\d{3}-\d{3}
。在任何地方应用选项-l
,-v
和-E
。"
也许你的意思
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}'