我有一些我正在搜索的日志文件,其中包含以下形式的条目
foo($abc) - sometext
foo ($xyz) - moretext
baz($qux) - moartext
我正在寻找使用 grep 将前两行作为匹配项输出,即foo($abc)
foo ($xyz)
我试过下面的grep语句grep 'foo(\$' log.txt
它输出第一个匹配项,但我尝试包含一个可选的空格,但都没有返回:grep 'foo\s?(\$' log.txt
我错误地使用了可选空间,但我不确定如何
最佳答案
您正在使用 POSIX BRE 正则表达式和 foo\s?(\$
匹配 foo
,一个空格,一个 文字 ?
, 文字 (
和文字 $
.
您可以使用
grep -E 'foo\s?\(\$' log.txt
在这里,-E
使模式 POSIX ERE,因此它现在匹配 foo
,然后是一个可选的空格和一个 ($
子串。看一个在线演示:
s='foo($abc) - sometext
foo ($xyz) - moretext
baz($qux) - moartext'
grep -E 'foo\s?\(\$' <<< "$s"
输出:foo($abc) - sometext
foo ($xyz) - moretext
您仍然可以使用更通用的语法,例如grep 'foo[[:space:]]\{0,1\}(\$' log.txt
它是一个 POSIX BRE 正则表达式匹配 foo
, 一个或零个空格,然后是 ($
子串。
关于grep - 如何在 Grep 语句中包含可选空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66314801/