sed没有按预期工作(尝试在字符串中的两个匹配项之间获取值)

时间:2016-05-29 20:33:31

标签: bash sed

我有一个文件(/ tmp / test),它有一个字符串" aaabbbccc"在其中

我想提取" bbb"来自带有sed的字符串。

执行此操作将返回整个字符串:

sed -n '/aaa/,/ccc/p' /tmp/test

我只想用sed从字符串返回bbb(我正在尝试学习sed,所以对其他解决方案不感兴趣)

2 个答案:

答案 0 :(得分:3)

Sed适用于基本行,a,b{action}将对匹配a的行执行操作,直到符合b的行。在你的情况下

sed -n '/aaa/,/ccc/p'

会在/aaa/匹配时开始打印行,并在/ccc/匹配时停止,这不是您想要的。

要操纵一条线,会有多个选项,一个是s/search/replace/,可用于移除前导aaa和尾随ccc

% sed 's/^aaa\|ccc$//g' /tmp/test
bbb

故障:

s/
  ^aaa  # Match literal aaa in beginning of string
  \|    # ... or ...
  ccc$  # Match literal ccc at the end of the sting
//      # Replace with nothing
g       # Global (Do until there is no more matches, normally when a match is
        # found and replacement is made this command stops replacing) 

如果您不确定有多少ac,那么您可以使用:

% sed 's/^aa*\|cc*$//g' /tmp/test
bbb

该字符串将与文字a后面的零个或多个a匹配。同样适用于c,但最后也是如此。

答案 1 :(得分:2)

使用GNU sed:

sed 's/aaa\(.*\)ccc/\1/' /tmp/test

输出:

bbb

请参阅:The Stack Overflow Regular Expressions FAQ