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 :/
Linux
  1. Sedコマンドで一度に複数のパターンを使用する

  2. ファイル内の文字列を置き換える方法は?

  3. Sedを使用して複数行の文字列を置き換える方法は?

  1. Sedは改行文字を置き換えることができますか?

  2. 行の範囲を行の範囲(sedまたはその他)に置き換えますか?

  3. Sedを使用してテキストファイルから複数のランダム行を削除する方法は?

  1. 複数のファイルテキストをSedに置き換えますか?

  2. sed 行を結合する

  3. Linuxコマンドラインで複数のファイルの文字列を置き換える方法