私ファイル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
ファイルの内容は一致する行の前に挿入されます。
その後、アドレス範囲間の行を削除します。//
使用された最後の正規表現を表します(コンマの後の末尾の範囲と{}
ブロック内の2つのアドレス)。
答え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
W3CHTML-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" -->