Как заменить строку в XML-файле набором строк, хранящихся в переменной или файле, с помощью команд Unix?

Как заменить строку в XML-файле набором строк, хранящихся в переменной или файле, с помощью команд Unix?

У меня есть XML-файл

в котором строка, которую нужно найти, следующая:

SEARCH='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'

Это искомое значение необходимо заменить значением в следующей переменной или сохранить в другом файле:

REPLACE='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>
'

Как это можно сделать с помощью команд unix, таких как SED или AWK? (Здесь SEARCH необходимо заменить на REPLACE.

решение1

Да, это можно сделать с помощью sed, но я согласен с Йенсом. Я бы рекомендовал использовать правильный инструмент, например, python + lxml library для поиска и замены ваших тегов.

решение2

Насколько я могу судить, персонажи, которых следует избегать:

awk '/<\?xml version="1.0" encoding="UTF-8" standalone="no"\?><SSC>/ {print "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>"}' <<< '<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'
  • в поле ПОИСК: вы хотите экранировать символы ? с помощью \?
  • в поле ЗАМЕНИТЬ: вы хотите экранировать «символы на \"

Или, если вам нужно использовать переменные, также экранируйте " в поле ПОИСК и экранируйте символы дважды: один раз для сохранения в переменной и два раза для вывода на экран!

SEARCH_escaped=`sed -e 's/\?/\\\?/g' -e 's/\"/\\\"/g' <<< $SEARCH`
REPLACE_escaped=`sed 's/\"/\\\"/g' <<< $REPLACE`

awk "/$SEARCH_escaped/ {print \"$REPLACE_escaped\"}" <<< $SEARCH

Связанный контент