GNU/Linux >> Linux の 問題 >  >> Linux

複数行にわたる SED 置換

解決策 1:

Sed は行単位で動作します。複数の行で動作するようにすることはできますが、そのように設計されたわけではありません。私の意見では、そのように使用しようとすると確実に表示されます。しかし、そのようにすることにした場合は、おそらくレジスターを使用する必要があります。 https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n への解決策のいくつかをチェックして、それを行う方法を確認してください。

この種のタスクには、sed の代わりに perl を使用することを好みます (つまり、複数行指向)。検索と置換の前に追加する必要があるボイラープレート (BEGIN... ) は明らかではありませんが、正規表現の方がすっきりしているように思えます:

perl -i.bak -pe 'BEGIN{undef $/;} s/<!--string-->/string/smg' file.xml

または、グループ化を使用して式を短縮し、そこで正規表現を使用できるようにします:

perl -i.bak -pe 'BEGIN{undef $/;} s/<!--(string_or_regex)-->/\1/smg' file.xml

コメント マーカーとコメント解除するコードの間に改行がある場合とない場合の両方で動作するはずです。

から適応:

https://stackoverflow.com/questions/1030787/multiline-search-replace-with-perl

解決策 2:

sed は各行を順番に読み取るため、正しい方向に微調整しない限り、複数行のパターンに一致することはありません。 N コマンドは、入力から 1 行を読み取り、それをパターン スペースに追加します。

sed -i -e '/^<!--$/ {
    N; /\n<Connector port="8009" protocol="AJP\/1\.3" redirectPort="8443" \/>$/ {
        N; /\n-->$/ {
            s/^<!--\n//; s/\n-->$//
        }
    }
}' /myfile.xml

おそらく、 s 以外のコマンドが必要な場合 の場合は、sed から awk または perl に切り替える必要があります。これは、より一般的な方法で複数行のコメントに対処する、もう少し柔軟な Perl スニペットです。

perl -i -pe '
    if (/<!--/) { $_ .= <> while !/-->/;
        s[<!--\n(<Connector port="8009" protocol="AJP/1\.3" redirectPort="8443" />)\n-->][$1];
    }' /myfile.xml

解決策 3:

SED の複数行コマンドの説明は次のとおりです:http://docstore.mik.ua/orelly/unix/sedawk/ch06_01.htm

お尻が痛いです。 Eduardo のアドバイスに従い、perl -i -p -e を使用することをお勧めします。

解決策 4:

  • /<\!--/ :一致する文字列
  • :X :これは分岐コマンド "b" のラベルです
  • /-->/ :一致する文字列
  • [email protected]@[email protected] :"" を取り除き、結果を出力します
  • d :パターン スペースを削除し、新しいサイクルを開始します
  • N :/-->/ と一致しない場合は、行を追加します
  • bX ::X ラベルへの分岐
  • p :/