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 -

答え2

Gnu sedを使用すると、次のことができます。

$ echo foo | sed -e 's/foo/cat foobar.txt/e'

s///e コマンドを使用すると、sed はパターン・スペース全体で動作します。末尾の改行文字もカットする必要があります。

またはPerlを使用してください。

 $ perl -lpe 's/foo/qx(cat foobar.txt)/e' 

関連情報