我正在尝试写一个 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/