use*_*678 4 shell grep regular-expression
我想搜索一个只有空格的字段。计数时,这两个命令给了我不同的结果:
grep "^\s*$" -E -c
grep "^(\s*$)" -E -c
Run Code Online (Sandbox Code Playgroud)
另一件事。什么是“仅空格或其他东西”的正确说法:
grep "^(\s*$|STRING)" -E -c
Run Code Online (Sandbox Code Playgroud)
或者
grep "(^\s*$|^STRING)" -E -c
Run Code Online (Sandbox Code Playgroud)
或者它们是等价的?
平原grep
不理解\s
或括号(*)你想要的。grep -P
如果有的话,或grep -E
/egrep
和写\s
出来的[ ^I]
(这里^I
是Tab;grep
没有-P
不理解\t
或者)。此外,使用双引号,一些 shell 将处理\s
并只留下s
; 您应该始终在 shell 中使用带有正则表达式的单引号,除非您确实需要插入一个变量(例如'^\s*'"$foo"'\s+\('
,在中间参数中切换引用)。
第二个示例中的替代方案(再次使用-P
单引号而不是双引号)做同样的事情。前者在技术上更好,因为grep
不会回溯那么多,但实际上无关紧要。
(*) pedantry:反斜杠括号会起作用,同样需要单引号,所以外壳不会吃反斜杠。 egrep
通常更容易。