【问题标题】:sed regex to non-greedy replace?sed 正则表达式到非贪婪替换?
【发布时间】:2010-12-13 17:20:40
【问题描述】:

我知道another question 非常相似,但由于某种原因我仍然遇到问题。

我有一个 GC 日志,我正在尝试修剪包含在 [] 中的 Tenured 部分。

63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs]

我申请s/\[Tenured:.*\]//

令人期待的是,结果被贪婪地修剪到该行的其余部分:

63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546:

所以让我们尝试不贪心 not 将右括号与s/\[Tenured:[^\]]*\]// 匹配,但遗憾的是没有匹配,sed 跳过该行,产生相同的原始输出:

63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs]

我如何非贪婪地匹配和替换该部分?谢谢,

【问题讨论】:

    标签: regex unix replace sed garbage-collection


    【解决方案1】:

    差不多:s/\[Tenured:[^]]*\]//

    手册说:

    要在列表中包含文字“]”,请将其设为第一个字符 (在可能的 '^' 之后)。

    即在这种情况下不需要反斜杠。

    • 拉兹

    【讨论】:

      【解决方案2】:
      sed -e 's/\[Tenured:[^]]*\]//'
      

      显然你不应该逃避右方括号。古怪!

      来自man re_format

      括号表达式是包含在 '[]' 中的字符列表 ... 要在列表中包含文字 ']',请将其设为第一个字符(可能的 `^' 之后)。

      【讨论】:

      • 哇,这太古怪了。我知道^ 的情况,但不知道]
      【解决方案3】:

      尝试.*? 的非贪婪变体.*。 (不确定sed的正则表达式引擎是否支持它,但值得一试。)

      编辑:这个之前的 SO 问题可能是相关的 - Non greedy regex matching in sed?

      【讨论】:

      • 我不相信 sed 支持这一点,但无论如何我只是再次尝试并没有快乐。
      • sed 通过 -r (GNU) 或 -E (BSD) 标志支持它。
      【解决方案4】:

      这行得通:

      echo "63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs]" | sed -e s/\\[Tenured:[^\]]*\\]//
      

      【讨论】:

      • 我认为这是可行的,因为外壳在进入 sed 之前进行了转义。不幸的是,对于 sed 脚本文件,情况并非如此。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 2010-10-20
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多