sed を使用して一致を複数行文字列に置き換える

sed を使用して一致を複数行文字列に置き換える

重複の可能性:
複数行の文字列を別の文字列に挿入

次のファイルがありますfoo.txt

金持ち
バー
ブザー音

bar各項目を変数に格納されている複数行の文字列に置き換えたいと思います$bar

1
2
サム

次に続く:

金持ち
1
2
サム
ブザー音

以下を使用してこれを行うことができますawk

エコ "$bar" |
        if(ファイル名=="-")
        {
            もし(i!="")
            {
                私=私"\n"
            }
            私=私$ 0
        }
        その他
        {
            if($0 == "バー")
            {
                私を印刷してください
            }
            その他
            {
                印刷
            }
        }
    } '

sedただし、usingで同じことをしようとするとsed 's/bar/'"$bar"'/' foobar.txtエラーが発生します。

sed: 1: “s/bar/1
2
3/": 代替パターン内でエスケープされていない改行文字

この問題は解決できますか?

他の標準ツールを使用してこれを行うより簡単な方法がある場合は、知りたいです。

ベストアンサー1

では、sedコマンドの右側で改行文字をエスケープする必要があるため、s次のように書く必要があります。

sed 's/foo/1\
2\
3/g'

一部のsed実装では、以下もサポートしています(非標準)。

sed 's/foo/1\n2\n3/g'

置き換える前に、$bar各改行文字の前にバックスラッシュを挿入する必要があります。これを行うときは、各スラッシュ、バックスラッシュ、アンパサンド文字の前にバックスラッシュを挿入する必要があります。

それは次のとおりです。

bar_escaped=$(printf '%s\n' "$bar" | sed 's,[\/&],\\&,g;s/$/\\/')
bar_escaped=${bar_escaped%?}
sed "s/foo/$bar_escaped/g"

おすすめ記事