regex - bash grep 方括号内的文本

标签 regex bash grep

我尝试从 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/

相关文章:

regex - 删除文本文件中模式后的所有字符

python - 捕获由重复组组成的整个匹配项的正则表达式

c - Shell 重定向不会移动标准输出的文件位置

linux - 如何在 bash 中检查文件是否创建时间超过 x 时间?

arrays - 如何将数组作为参数传递给 Bash 中的函数

linux - 通过使用匹配多列的一列连接两个 csv 文件

JavaScript 正则表达式语法

php - 用 Regex 或 DOM 替换所有包含给定 href 属性的 <link> 标签

linux - 在 grep 搜索后添加 echo

bash - 从 bash 中的文件中 grep 精确模式