麻烦写bash sed命令-正则表达式匹配

时间:2018-08-28 04:12:21

标签: regex linux bash macos sed

我有一个文件,其中充满了不规则的垃圾收集信息,有些行包含一些我最初要删除的额外信息,因此我可以将文件作为一个整体来处理。

不幸的是,该行有很多特殊字符,我正在努力使用sed命令,该命令设法与我要删除的位相匹配...

该行包括以下内容:

[ParOldGen: 0K->0K(0K)] 0K->0K(0K), [Metaspace: 0K->0K(0K)], 0 secs]

该行还有我想保留的有关上述字符串的其他信息,其中包括[]()个字符。

我想比赛

[ParOldGen*secs]

然后使用sed删除它

cat test.log | sed -e 's,<match>,,g' | ...

我去检查了正则表达式检查器,该检查器带有:

\[ParOldGen(?:(?!secs\])(?:.|\n))*secs\]

但是,它与sed -e不匹配,并且在使用sed -E时出错

我不能轻易使用cut,因为包含[和]的其他部分过多。

我正在尝试这样的事情:

cat test.log | while read line; do if [ "$line" == *"ParOldGen"* ];then cut -d ":" -f 1,9; else cut -d ":" -f 1,7; fi; done | tail

可以有效地解决该问题,但是我无法在ParOldGen上获得匹配项,它总是只执行then部分。

我的预期输出是我想删除ParOldGen行。

有人能帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我正在假设您要从文件的每一行中删除从[ParOldGen开始并以secs]结尾的整个字符串。在这种情况下,您可以使用以下sed命令:

sed -e 's/^\(.*\)\[ParOldGen.*secs\]\(.*\)$/\1\2/' test.log

正则表达式将[ParOldGen之前的所有字符捕获到一个捕获组中,并将secs]之后的任何字符捕获到另一捕获组中。然后,将整个行替换为这两个捕获组,从而有效地将字符从[ParOldGen删除到secs]。例如如果test.log包含:

[Some other data (4) ][ParOldGen: 0K->0K(0K)] 0K->0K(0K), [Metaspace: 0K->0K(0K)], 0 secs] and then some more [possibly also with ()]

cat test.log | sed -e 's/^\(.*\)\[ParOldGen.*secs\]\(.*\)$/\1\2/'的输出是

[Some other data (4) ] and then some more [possibly also with ()]