【问题标题】:understanding sed regex with numbered groups理解带有编号组的 sed 正则表达式
【发布时间】:2014-11-17 13:39:33
【问题描述】:

我正在尝试理解这个 sed 正则表达式。

       sed 's/.*\(ADDR=[^|]*\) |.*/\1/'

如果我没记错的话,上面会在一行中的任意位置搜索模式 ADDR=<something> 并且 将其替换为第一组。我不明白 [^|] 的含义。感谢您的帮助。

【问题讨论】:

  • “零个或多个不是|的字符(竖线字符)”。
  • [^|] 匹配除| 之外的任何内容。字符类中的^ 否定字符类
  • 为了使替换成功,必须存在两个字符串,并且顺序为ADDR=|。返回的成功组可能只包含匹配字符串。

标签: regex linux sed


【解决方案1】:

\(ADDR=[^|]*\) |.*/\1/

这里

  • [^|] 匹配除| 之外的任何内容,而量词* 量化它的零次或多次出现。字符类中的^ 否定字符类。

  • | 匹配字符|

注意sed 元字符中,如| ( ) 等将失去意义,因此| 不是替代字符,而是匹配| 字符。如果你想这样对待元字符,那么-r(扩展正则表达式)会这样做(使用GNU sed;使用-E 和BSD sed)。或者转义\|

示例:

$ echo "hello ADDR= hello | world " | sed 's/.*\(ADDR=[^|]*\) |.*/\1/'
ADDR= hello

这里的(ADDR=[^|]*\) 匹配来自ADDR= hello,其中包含除| 之外的任何内容。

【讨论】:

  • “在sed 中,正则表达式中的所有元字符都将[失去] [它们的]含义”——这几乎不正确;它只是一种更受限制的正则表达式方言。它当然有元字符,例如.*[\
  • @tripleee 我已经编辑了答案以纠正那个误导性的句子
【解决方案2】:

[^...] 匹配不在类中的任何单个字符。

| 竖线分隔两个或多个备选方案。如果满足任何备选方案,则发生匹配。例如,gray|grey 匹配 graygrey

[^|] 匹配除| 之外的任何内容。字符类中的^ 否定字符类,而| 是松散的,它与sed 一起使用时的实际含义。

【讨论】:

  • 您可能会注意到,在字符类中,包括| 在内的每个元字符都会失去其意义
  • 当然是@nu11p01n73R
  • 这里的| 也并不意味着交替,因为在 sed 中它也失去了它的含义,被视为单个字符 |
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 2020-12-09
  • 2017-02-12
  • 2020-03-09
  • 2014-11-27
  • 1970-01-01
相关资源
最近更新 更多