用sed替换较大部分内的一个单词?

时间:2015-03-11 01:45:17

标签: bash sed

我意识到sed可以在多行上进行模式匹配。是否可以替换这些多行中某一部分内的单词? E.g。

file begins
random line
>>starting line block
    random line
    random line
    .....
    >>replace from here
     hello
     hi there hello
    >>stop replacing here
    more random stuff
>>finishing line block 
more random lines
file ends

假设我要替换'你好'随着' bye'但只能在这里取代'要停止更换这里'而且也只是在“起跑线”之间到了终点线块#39;是否有可能使用sed做到这一点? e.g。

sed '/starting line block/,/finishing line block/ /replace from here/,/stop replacing here/ s/hello/bye/g/'

1 个答案:

答案 0 :(得分:3)

您可以使用块,如下面的sed脚本:

/start/,/end/ {
    /from/,/to/s/foo/bar/g
}

使用sed -f <script> "$file"运行它。

{}括号分隔命令块,/start/,/end/是命令运行的行范围。在这种情况下,我们只有一个命令s/foo/bar/g,我们为每个块中/from/,/to/范围内的每一行运行。

以上内容也会在s/foo/bar/gfrom分隔符的行上运行to。我猜这应该没事。

如果多个行范围与/start/,/end//from/,/to/匹配,这也适用。

以下单行也适用于GNU和(至少一个)BSD sed。 POSIX没有指定;来分隔命令,并且在结束}link to spec.)之前需要换行符,因此它可能不太便于移植。

sed '/start/,/end/{/from/,/to/s/foo/bar/g;}' "$file"

如果您正在解析XML或HTML,您应该小心,因为评论中的某些人指出了这一点。 Here's一个似乎很有名的答案,尽管还有this。实用主义最终可能取决于您的要求和输入数据,特别是一次性。