Grep - ^(\s*$) 与 ^\s*$

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)

或者它们是等价的?

gee*_*aur 5

平原grep不理解\s或括号(*)你想要的。grep -P如果有的话,或grep -E/egrep和写\s出来的[ ^I](这里^ITab;grep没有-P不理解\t或者)。此外,使用双引号,一些 shell 将处理\s并只留下s; 您应该始终在 shell 中使用带有正则表达式的单引号,除非您确实需要插入一个变量(例如'^\s*'"$foo"'\s+\(',在中间参数中切换引用)。

第二个示例中的替代方案(再次使用-P单引号而不是双引号)做同样的事情。前者在技术上更好,因为grep不会回溯那么多,但实际上无关紧要。

(*) pedantry:反斜杠括号会起作用,同样需要单引号,所以外壳不会吃反斜杠。 egrep通常更容易。