我想搜索一个只有空格的字段。计数时,这两个命令给了我不同的结果:
grep "^\s*$" -E -c
grep "^(\s*$)" -E -c
另一件事。 “仅空格或其他内容”的正确说法是什么:
grep "^(\s*$|STRING)" -E -c
或者
grep "(^\s*$|^STRING)" -E -c
或者说它们是等价的?
答案1
Plaingrep
不理解\s
或括号。(*)grep -P
如果可用,您想要或grep -E
/egrep
并写出\s
为[ ^I]
(其中^I
是Tab;grep
没有-P
也不理解\t
)。此外,使用双引号,某些 shell 将处理\s
并仅留下s
;您应该始终在 shell 中对正则表达式使用单引号,除非您实际需要插入变量(例如'^\s*'"$foo"'\s+\('
,在中间参数中切换引用)。
第二个示例中的替代方案(同样,使用-P
单引号而不是双引号)执行相同的操作。前者在技术上更好,因为grep
不会回溯那么多,但实际上并不重要。
(*) 迂腐:反斜杠括号可以工作,同样需要单引号,这样 shell 就不会吃掉反斜杠。 egrep
通常更容易。