解決策 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
:/