我意识到 sed 可以在多行上进行模式匹配。是否可以替换这多行的某个部分中的某个单词?例如
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
假设我想用“再见”替换“你好”,但仅限于“从此处替换”到“停止此处替换”之间,并且仅在“起始线 block ”到“终点线 block ”之间。是否可以使用 sed 就地完成此操作?例如
sed '/起始线 block /,/终点线 block //从这里替换/,/停止在这里替换/s/hello/bye/g/'
最佳答案
您可以使用 block 来实现此目的,如下所示 sed
脚本:
/start/,/end/ {
/from/,/to/s/foo/bar/g
}
使用 sed -f <script> "$file"
运行它.
{}
方括号分隔命令 block ,并且 /start/,/end/
是将运行命令的行范围。在本例中,我们有一个命令 s/foo/bar/g
,我们为 /from/,/to/
范围内的每一行运行它在每个 block 内。
以上将运行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 。实用主义最终可能会获胜,具体取决于您的要求和输入数据,尤其是对于一次性数据。
关于bash - 用 sed 替换更大部分中的一个单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28977206/