У меня есть 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