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)
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.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
Run Code Online (Sandbox Code Playgroud)
反而?
-f FILE, 从 中获取模式,每行一个。如果此选项被多次使用或与( ) 选项结合使用,则搜索给定的所有模式。空文件包含零个模式,因此不匹配任何内容。--file=FILEFILE-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)