sed - 如何编写一个 `sed` 脚本,用另一个文件的内容替换两个标记之间的文本

标签 sed

我正在尝试写一个 sed用另一个文件的内容替换两个标记之间包含的文本的脚本。

假设我有以下带有标记的文件 <!-- Start --><!-- End --> :

# index.html
...
<!-- Start -->
<p>Old content</p>
<!-- End -->
...

我想用这个文件的内容替换封闭的文本:

# snippet.html
<p>New content</p>

我试过这个 sed脚本:

$ cat snippet.html | sed -i -e '/<\!-- Start -->/,/<\!-- End -->/ { r /dev/stdin' -e';d};' index.html

它替换了内容和标记,但我需要保留 <!-- Start --><!-- End -->标记,以便我以后可以再次替换内容。

我应该对 sed 进行哪些更改?脚本?

提前致谢!

最佳答案

您需要对代码做的就是在 d 之前添加 //!:

cat snippet | sed -e '/<\!-- Start -->/,/<\!-- End -->/ { r /dev/stdin' -e '; //!d }' file

// 是“last match”的简写...所以在 /START/,/END/{ } 的情况下 没有任何其他匹配项>{ },它将匹配两者 /START//END/

//!d 确保范围(开始和结束处的匹配行除外)将被删除。

ETA:正如@potong 在评论中提出的那样,r/dev/stdin 的使用似乎是一种特殊情况——只有第一个 r 会添加任何内容到输出流。

关于sed - 如何编写一个 `sed` 脚本,用另一个文件的内容替换两个标记之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72850429/

相关文章:

linux - 如何在特定行之后使用 sed 每隔一行打印一次

UNIX - 将标题添加到每行的第一列

sed - 了解 sed 保持空间工作流程

regex - awk 或 sed : Return lines between two instances of the same pattern

linux - 使用cpp预处理将字符串中的0x0D替换为0x0A

sed - 使用 sed 删除文件的行 - 意外行为

regex - 我如何选择标记 (*) 之间的多行,不包括最后一行(使用 sed)?我如何选择所有其余的?

linux shell脚本sed css结构

regex - 如何使用自定义分隔符删除模式之间的行

linux - 忽略 find 命令中的目录