あるファイルの内容を別のファイルに挿入してパターン間を置き換える

あるファイルの内容を別のファイルに挿入してパターン間を置き換える

ファイル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" -->

関連情報