我尝试从 Linux bash 上的日志文件中 grep 文本。文本在两个方括号内。
例如在:
32432423 jkhkjh [234] hkjh32 2342342
我正在搜索 234
。
通常应该能找到它
\[(.*?)\]
但不是
|grep \[(.*?)\]
用grep进行正则表达式搜索的正确方法是什么
最佳答案
您可以查找左括号并使用 \K
转义序列清除。然后,匹配右括号:
$ grep -Po '\[\K[^]]*' <<< "32432423 jkhkjh [234] hkjh32 2342342"
234
请注意,您可以省略 -P
(Perl 扩展正则表达式),方法是:
$ grep -o '\[.*]' <<< "32432423 jkhkjh [234] hkjh32 2342342"
[234]
但是,如您所见,这也会打印括号。这就是为什么让 -P
执行后视和后视很有用。
您还在正则表达式中提到了 ?
。好吧,如您所知,*?
是让正则表达式匹配以非贪婪方式运行。让我们看一个例子:
$ grep -Po '\[.*?]' <<< "32432423 jkhkjh [23]4] hkjh32 2342342"
[23]
$ grep -Po '\[.*]' <<< "32432423 jkhkjh [23]4] hkjh32 2342342"
[23]4]
对于 .*?
,在 [23]4]
中它匹配 [23]
。仅使用 .*
,它匹配最后一个 ]
,因此得到 [23]4]
。此行为仅适用于 -P
选项。
关于regex - bash grep 方括号内的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39412636/