将一个文件的内容插入另一个文件并在模式之间替换

将一个文件的内容插入另一个文件并在模式之间替换

我有一个文件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" -->

相关内容