我有一个文件1.html:
<!doctype html>
<html>
<head>
</head>
<body>
text
<!-- start-replacing -->
<p>more text1</p>
<p>more text2</p>
<!-- end-replacing -->
other text
</body>
</html>
和一个文件2.txt
<p>some text</p>
<div>some other text</div>
现在我正在寻找一个命令来替换之间的所有内容
<!-- start-replacing -->
和<!-- end-replacing -->
与 file2.txt 的内容
这输出.html应该:
<!doctype html>
<html>
<head>
</head>
<body>
text
<!-- start-replacing -->
<p>some text</p>
<div>some other text</div>
<!-- end-replacing -->
other text
</body>
</html>
答案1
和perl
:
perl -0777 -pe '
BEGIN{$repl = <STDIN>}
s/<!-- start-replacing -->\K.*?(?=<!-- end-replacing -->)/$repl/sg
' file1.html < file2.txt > output.html
答案2
和GNU sed
:
sed -e '/<!-- end-replacing -->/e cat file2.txt' -e '/<!-- start-replacing -->/,//{//!d}' file1.html
该e
命令用于调用cat file2.txt
结束地址范围上的外部命令。文件内容将插入到匹配行之前。
然后删除地址范围之间的行。//
表示最后使用的正则表达式(逗号后的结束范围以及{}
块内的两个地址)。
答案3
使用sed
$ sed -Ee '/start-replacing/{{r file2.txt' -e '};n;:a;N;s/.*\n(.*end-replacing[^\n]*\n)/\1/;ba}' file1.html
<!doctype html>
<html>
<head>
</head>
<body>
text
<!-- start-replacing -->
<p>some text</p>
<div>some other text</div>
<!-- end-replacing -->
other text
</body>
</html>
答案4
W3C 的HTML-XML-utils
HTML 感知和/或 XML 感知。这hxincl
包中的实用程序html-xml-utils
会扩展某些嵌入的注释或打印makefile
列出依赖包含文件的规则。
hxincl -s incfnm='file2.txt' file1.html
给定稍微修改的输入,生成所需的输出:
<!-- begin-include "incfnm" -->
<p>more text1</p>
<p>more text2</p>
<!-- end-include "incfnm" -->