bash - 用 sed 替换更大部分中的一个单词?

标签 bash sed

我意识到 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/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 。实用主义最终可能会获胜,具体取决于您的要求和输入数据,尤其是对于一次性数据。

关于bash - 用 sed 替换更大部分中的一个单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28977206/

相关文章:

arrays - 在 bash 中将数组作为参数传递

regex - 如果第二行包含与第一行相同的匹配项,我如何打印 2 行?

bash - 在 Bash 中使用 getopts 检索单个选项的多个参数

linux - 替换部分正则表达式并保留前缀/后缀

regex - 同时获取一行的第一个元素和特定单词之后的另一个元素

linux - Bash for循环在远程服务器上执行命令

bash - 如何避免根据终端类型打印转义序列?

shell - 从丑陋的命令行管道创建整洁的 shell 脚本

java - 自动注释 Java 类的程序/脚本

design-patterns - SED:在模式上方插入行并将模式空间附加到它