我有一个名为“insert.txt”的文件。它可能看起来像这样(或更丑陋):
ASDFG?|??|?\/\HJKL<MNBVCXZQWERTYUIOP
zxvbnmlkjhgfdsaqwertyuiop
123"'`~4567890987654321!@#$%^&*()
@#$%^&*()+_}{":?>
我想将目标文件(target.txt)中的一个文本块替换为“STARTSTACKOVERFLOW”到“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 是否有更好的方法来完成上述操作?