从 grep 输出中隐藏部分匹配

从 grep 输出中隐藏部分匹配

我有一个用于会话 ID 提取的正则表达式:

[root@docker tmp]# grep -oE "\[[0-9].+\]" logfile
[113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]
[113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]
[root@docker tmp]#

如何在输出中隐藏方括号?

答案1

不要使用扩展正则表达式 grep ( -E),而是使用 perl-正则表达式 grep ( -P),并带有后向查找和先行查找。

$ grep -oP "(?<=\[)[0-9].+(?=\])" logfile
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c

这里,(?<=\[)表示应该有一个前置\[,并(?=\])表示应该有一个以下\],但不将它们包含在匹配输出中。

答案2

$ cat a.txt
test hello..[113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]... this is
te [113a6d9e-7b06-42c6-a52b-7a4e4d2e216c].  this  is hello

$ grep -oP '(?<=\[)[^\]]*' a.txt
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c

https://stackoverflow.com/a/19242713/6947646

答案3

sed比该案例更适用grep

sed '/\n/{P;D;};s/\[/\n/;s/\]/\n/;D' log

答案4

最简单的方法是删除tr它们:

$ grep -oE "\[[0-9].+\]" logfile | tr -d '[]'
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c

请注意,该tr实用程序并不像 shell 那样了解正则表达式或模式。在这种情况下,[]操作数只是两个字符[]

相关内容