我有一个用于会话 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
答案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 那样了解正则表达式或模式。在这种情况下,[]
操作数只是两个字符[
和]
。