bashスクリプトで複雑な複数行テキストを置き換える方法は?

bashスクリプトで複雑な複数行テキストを置き換える方法は?

Bashのファイルで特定の複数行のテキストを置き換えたいのですが、エラーが発生します。

複数行なので失敗だと思います。 1行(スペースと特殊文字を含む)でコードをテストすると正常に動作しますが、複数行のターゲット全体を追加して置き換えると失敗します。

ファイル.txt

<html>
    <head>
        <title>
            O-HELLO-1
        </title>
    </head>
</html>

<html>
    <head>
        <title>
            O-HELLO-2
        </title>
    </head>
</html>

スクリプトファイル

#!/bin/bash

target="<html>
    <head>
        <title>
            O-HELLO-1
        </title>
   </head>
</html>";

replacement="<a>
    <b>
        <c>
            R-HELLO-1
        </c>
    </b>
</a>";

echo "------------------";
out=$(sed -i -e "s/$target/$replacement/g" file.txt);

if [[ -n $out ]]; then
    cat file.txt;
    if [ -f file.txt-e ]; then
        rm file.txt-e;
        echo "------------------";
        echo "duplicate file removed.";
    fi
    echo;
fi
echo "------------------";

エラー履歴

sed: 1: "s/<html>
    <head>
    ...": unterminated substitute pattern

ベストアンサー1

まずご案内申し上げます。この「テキスト」は、実際にはXMLや類似のマークアップ言語のように見えます。このように複雑で微妙な入力を単純で書式のないテキストで処理すると、長期的に問題が発生する可能性が高くなります。次のツールを使用することをお勧めします。XMLスターまたは代わりに同様のもの。

それにもかかわらず、解決策の1つは、GNU awkが提供するものと同じ変数を使用することです。

awk -v target="$target" -v replacement="$replacement" '{ gsub(target, replacement, $0) } 1'

もう一度繰り返します。この操作を繰り返し実行したり、結果を監視したくない場合は、気になることを避け、実際に使用しているマークアップ言語のすべての部分を処理するプログラムを使用してください。XMLスター、Pythonlxmlまたは同様のもの。

おすすめ記事