【问题标题】:Trouble writing bash sed command - regex match编写 bash sed 命令时遇到问题 - 正则表达式匹配
【发布时间】:2019-02-02 14:54:05
【问题描述】:

我有一个文件,其中包含不规则的垃圾收集信息,有些行包含我想最初删除的额外信息,以便我可以将文件作为一个整体进行处理。

不幸的是,该行有很多特殊字符,我正在努力使用 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 行。

有人能帮我解决这个问题吗?

谢谢!

【问题讨论】:

  • 你能从你的日志文件中提供更多的行吗?
  • 你期待什么输出?
  • 我要匹配的字符串总是我给定的格式 - 还有其他部分有 [ 和 ] 所以我不能使用 cut... 它在一行的中间所以没有容易使用的分隔符。我曾考虑过尝试使用 if 语句,但我想在一行代码中做到这一点。我也会提出我正在尝试的替代命令。
  • 您要完全删除该行吗?
  • 只是我确定的那部分行。

标签: regex linux bash macos sed


【解决方案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 ()]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 2022-11-16
    • 2022-06-10
    • 1970-01-01
    • 2018-05-31
    • 2012-07-11
    • 2018-12-30
    相关资源
    最近更新 更多