У меня есть файл с именем "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?