我意识到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/'
答案 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/g
和from
分隔符的行上运行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。实用主义最终可能取决于您的要求和输入数据,特别是一次性。