「insert.txt」という名前のファイルがあります。次のようになります (または醜い):
ASDFG?|??|?\/\HJKL<MNBVCXZQWERTYUIOP
zxvbnmlkjhgfdsaqwertyuiop
123"'`~4567890987654321!@#$%^&*()
@#$%^&*()+_}{":?>
そして、「STARTSTACKOVERFLOW」で区切られたターゲット ファイル (target.txt) 内のテキスト ブロックを「STOPSTACKOVERFLOW」に置き換えたいと考えています。(ここでは質問を少し単純化していますが、同じです)。
これを行うために使用するbashスクリプトは次のとおりです。
TARGETFILE=target.txt
SOURCEFILE=insert.txt
SOURCETXT="$(<$SOURCEFILE)"
DELIMTXT=$(printf "%q" "$SOURCETXT")
sed -i -e "/STARTSTACKOVERFLOW/,/STOPSTACKOVERFLOW/cSTARTSTACKOVERFLOW\n\n${DELIMTXT}\n\nSTOPSTACKOVERFLOW\n" $TARGETFILE
問題は、「target.txt」に貼り付けられたものが実際には ANSI-C で引用されていることです。
$'ASDFG?|??|?\/\HJKL<MNBVCXZQWERTYUIOP
zxvbnmlkjhgfdsaqwertyuiop
123"'`~4567890987654321!@#$%^&*()
@#$%^&*()+_}{":?>'
$'' が追加されていることに注意してください。
その理由は、printf "%q" がこの引用スタイルを生成しているためです。私はそれを避けたいと思いますが、このファイルのすべての悪さを回避しなければならないので必要です。
bash と sed を使用して上記を行うより良い方法はありますか?