我尝试从 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 进行正则表达式搜索的正确方法是什么
要 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 个或多个字符[(?=])- 正向前瞻,需要紧邻]当前位置右侧的一个字符。您可以查找左括号并使用\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选项。