web-dev-qa-db-ja.com

複数行にわたって検索してPerlに置き換えるにはどうすればよいですか?

$ Perl --version
This is Perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi

$ echo -e "foo\nbar" > baz.txt
$ Perl -p -e 's/foo\nbar/FOO\nBAR/m' baz.txt
foo
bar

この代替品を機能させるにはどうすればよいですか?

17
Gabe Kopley

-0スイッチを使用して、入力セパレータを変更できます。

Perl -0777pe 's/foo\nbar/FOO\nBAR/' baz.txt

-0777は区切り文字をundefに設定し、-0だけで\0に設定します。これは、ヌルバイトを含まないテキストファイルで機能する可能性があります。

正規表現には/m^も含まれていないため、$は不要であることに注意してください。

38
choroba

それは-pスイッチと関係があります。入力を一度に1行ずつ読み取ります。したがって、2行間の改行は一致しないため、正規表現を実行することはできません。できることの1つは、すべての入力変更変数$/を読み取り、それに正規表現を適用することです。一方通行:

Perl -e 'undef $/; $s = <>; $s =~ s/foo\nbar/FOO\nBAR/; print $s' baz.txt

それは以下をもたらします:

FOO
BAR
5
Birei