我最初想要搜索文件并找到与搜索字符串完全匹配的行。所以我在我的剧本中使用了这个:
grep -E ^"${sSearchString}"$ <file name>
其中^
和$
分别标记了行的开头和结尾。
然后我意识到该行可能包含前导或尾随空格。要忽略尾随空格,我将代码更改为:
grep -E ^"${sSearchString}*( )"$ <file name>
再次正常工作 1 。
但是,这对前导空格不起作用:
grep -E ^"*( )${sSearchString}*( )"$ <file name>
运行它(从命令行,如下所示:grep -E ^"*( )<search string>*( )"$ <file name>
)给出了这个错误:
grep: RE error in ^*( )search string*( )$ ?, *, +, or { } not preceded by valid regular expression
为什么*( )
在搜索字符串之前失败但在之后工作?
1虽然将*( )
替换为*(\s)
但未返回任何内容。任何想法为什么不呢?
答案 0 :(得分:2)
你的语法错了。它应该是( )*
,而不是*( )
。
grep -E ^"( )*${sSearchString}( )*"$ <file name>
此外,如果您也想忽略制表符和换行符,请使用\s*
。
答案 1 :(得分:1)
它最终适用,因为重复是g
而不是( )
。
一开始就失败了,因为没有什么可重复的。