我有一个文件,其中充满了不规则的垃圾收集信息,有些行包含一些我最初要删除的额外信息,因此我可以将文件作为一个整体来处理。
不幸的是,该行有很多特殊字符,我正在努力使用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行。
有人能帮助我吗?
谢谢!
答案 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 ()]