sed 置換の入力として改行文字を含むファイルを使用する

sed 置換の入力として改行文字を含むファイルを使用する

一部のファイルを再フォーマットするスクリプトを作成しています。既存のコンテンツを置き換えるコンテンツに改行が含まれていることを除いて、詳細は重要ではありません。 Sed は改行文字を sed コマンドを終了すると解釈し、エラーを返します。まず、Windowsのgitbashで試してから、CentOS 7で試しました。以下の出力は、入力ファイルに改行文字が表示された場合にsedコマンドが失敗することを示しています。

$ echo foobar > foobar.txt

$ echo foo | sed "s/foo/$(cat foobar.txt)/"
foobar

$ echo barfoo >> foobar.txt

$ cat foobar.txt
foobar
barfoo

$ echo foo | sed "s/foo/$(cat foobar.txt)/"
sed: -e expression #1, char 12: unterminated `s' command

出力が欲しいです。

foobar
barfoo

\n改行文字を変換またはエスケープする簡単な方法(よくハックしてください。本番環境では機能しません)がありますか?

ベストアンサー1

escaped_file_contents=$(<foobar.txt sed 's:[\/&]:\\&:g;$!s/$/\\/')
sed "s/foo/$escaped_file_contents/g"

ただし、後続の空白行(foobar.txt存在する場合)は削除されます。

これを見て同様の質問と回答もっと学ぶ。

または以下を使用してperl

REPL=$(cat foobar.txt) perl -pe 's/foo/$ENV{REPL}/g'

またはperl直接内容を読んでください。foobar.txt

perl -pe '
  BEGIN {$/ = undef; $repl = <>; $_ = "\n"; chomp $repl}
  s/foo/$repl/g' foobar.txt -

おすすめ記事