方括号内的bash grep文本

use*_*793 3 regex bash grep

我尝试从 linux bash 上的日志文件中 grep 文本。文本在两个方括号内。

例如在:

32432423 jkhkjh [234] hkjh32 2342342
Run Code Online (Sandbox Code Playgroud)

我正在寻找234

通常应该找到它

 \[(.*?)\]
Run Code Online (Sandbox Code Playgroud)

但不是与

|grep \[(.*?)\]
Run Code Online (Sandbox Code Playgroud)

使用 grep 进行正则表达式搜索的正确方法是什么

Wik*_*żew 7

要 grep 方括号之间的所有值(包括方括号),您可以使用基于 POSIX BRE 的grep命令,例如

grep -o '\[[^][]*]' file
Run Code Online (Sandbox Code Playgroud)

...以及同类奖励解决方案:

grep -o '<[^<>]*>' file # Extracting all strings between angle brackets
grep -o '([^()]*)' file # Extracting all strings between parentheses
grep -o '{[^{}]*}' file # Extracting all strings between curly braces
grep -o '"[^"]*"'  file # Extracting all strings between double quotes
grep -o "'[^']*'"  file # Extracting all strings between single quotes
Run Code Online (Sandbox Code Playgroud)

请参阅在线grep演示。该-o选项使grep输出仅匹配子字符串,而不是整行,并且\[[^][]*]模式匹配 a [,然后匹配 0 次或多次出现的任何字符,但[and ](请参阅否定[^][]*括号表达式),然后匹配 a ]

如果您需要获取方括号内(不包括方括号)内的值,您可以使用基于 PCRE 正则表达式的grep命令,例如

grep -oP '\[\K[^][]*(?=])' file
Run Code Online (Sandbox Code Playgroud)

查看另一个在线演示

模式\[\K[^][]*(?=])匹配

  • \[- 一个[字符
  • \K- 匹配重置运算符,丢弃匹配内存缓冲区中迄今为止匹配的文本
  • [^][]*]- 除and之外的 0 个或多个字符[
  • (?=])- 正向前瞻,需要紧邻]当前位置右侧的一个字符。


fed*_*qui 5

您可以查找左括号并使用\K转义序列清除。然后,匹配到右括号:

$ grep -Po '\[\K[^]]*' <<< "32432423 jkhkjh [234] hkjh32 2342342"
234
Run Code Online (Sandbox Code Playgroud)

请注意,您可以通过以下方式省略-P(Perl 扩展正则表达式):

$ grep -o '\[.*]' <<< "32432423 jkhkjh [234] hkjh32 2342342"
[234]
Run Code Online (Sandbox Code Playgroud)

但是,如您所见,这也会打印括号。这就是为什么必须-P执行后视和照看很有用的原因。

你也在?你的正则表达式中提到。好吧,正如您已经知道的,*?是让正则表达式匹配以非贪婪的方式运行。让我们看一个例子:

$ grep -Po '\[.*?]' <<< "32432423 jkhkjh [23]4] hkjh32 2342342"
[23]
$ grep -Po '\[.*]' <<< "32432423 jkhkjh [23]4] hkjh32 2342342"
[23]4]
Run Code Online (Sandbox Code Playgroud)

.*?,在[23]4]它匹配[23]。使用 just .*,它匹配到最后一个,]因此得到[23]4]。此行为仅适用于该-P选项。