Я пишу сценарий для перебора набора файлов в каталоге, ищущего строку (stringA
) в одном файле (srcFile
), копирую следующую за ней строку (stringToCopy
) и вставка его в строку после другой строки поиска (stringB
) в другом файле (outputFile
). Скрипт копирования / вставки, который у меня есть, выглядит следующим образом:
stringA="This is string A"
stringB="This is string B"
srcFile=srcFile.txt
outpuFile=outputFile.txt
replacement="/$stringA/{getline; print}"
stringToCopy="$(awk "$replacement" $srcFile)"
sed -i "/$stringB/!b;n;c${stringToCopy}" $outputFile
Скрипт отлично работает, за исключением случаев, когда stringToCopy
заканчивается фигурными скобками. Пример:
srcFile.txt:
This is string A
text to copy: {0}
outputFile.txt:
This is string B
line to be replaced
После того, как скрипт будет готов, я ожидаю, что outputFile.txt
будет
This is string B
text to copy: {0}
Но sed задыхается от
sed: -e expression #1, char 106: unknown command: `m'
Я пробовал жестко кодировать строку с проблемойati c и пробовать различные варианты экранирования завитушек и цитирования строки, но не нашел выигрышная комбинация, и я не понимаю, как заставить ее работать.
EDIT У меня был сумасшедший момент, и я забыл, что мой stringA
также имеет фигурные скобки, из-за которых моя команда awk вычисляла несколько строк. Это привело к тому, что в моем stringToCopy
были символы новой строки, что является моей настоящей проблемой, а не фигурными скобками. Итак, реальный вопрос заключается в том, как заставить awk обрабатывать фигурные скобки как буквальные символы, чтобы srcFile.txt
This is string A: {0}
text to copy: {0}
This is string A:
Other junk
и stringA="This is string A: {0}"
не устанавливал stringToCopy
в
text to copy: {0}
Other junk