了解带编号组的sed正则表达式

时间:2014-11-17 03:56:45

标签: regex linux sed

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

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

如果我没错,以上内容将在一行中的任何地方搜索模式ADDR=<something> 用第一组替换它。我在这里没有得到 [^ |] 的含义。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

[^...]匹配班级中没有的任何单个字符。

|垂直条分隔两个或更多选项。如果满足任何替代方案,则匹配发生。例如,gray|grey匹配graygrey

[^|]匹配|以外的任何内容。字符类中的^否定了字符类,而|在使用sed时失去了它的实际意义。

答案 1 :(得分:2)

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

这里

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

  • |匹配字符|

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

示例:

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

(ADDR=[^|]*\)来自ADDR= hello的{​​{1}}匹配,其中包含|以外的任何内容。