重複の可能性:
複数行の文字列を別の文字列に挿入
次のファイルがあります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"