Вы можете попробовать:
sed -i 's/<Context *>/<Content allowLinking="false" \n privileged="false" \n useHttpOnly="true" \n xmlValidation="false">/' /tmp/context.xml
При этом используется команда s
вместо вашей команды i
, и она заменяет ваш space.*?
в поиске просто space*
.
.*?
может быть полезен, если вы хотите заменить существующие атрибуты, но он будет работать только в том случае, если все они будут в одной строке, и в любом случае вам понадобится что-то вроде [^>]*
чтобы не глотать закрытие >
.
Наконец, более чистый, более общий способ написания этого - использовать переменные оболочки (протестировано с bash
):
ATTRIB='allowLinking="false" \n privileged="false" \n useHttpOnly="true" \n xmlValidation="false"'
TAG='Context'
sed -i "s/<${TAG} *>/<${TAG} ${ATTRIB}>/" /tmp/context.xml
Внимание: Как отмечает Майкл Кей в своем комментарии:
[Это] сработало только потому, что вам повезло: в ваших данных не было специальных символов, таких как амперсанды.
В Linux sed
следует помнить о специальных символах [\^$.*&
и -]
после [
. sed -E
добавляет ?+|{}()
, см. здесь . Другие sed
могут включать больше.
Также, как написано, пример не может включать одинарные кавычки '
или косую черту /
, если только они не экранированы обратной косой чертой \
. Обратите внимание, что \n
используется для ввода переносов строк; здесь можно использовать обратную косую черту.
Наконец, как отмечает Майкл Кей, это не работа для sed, а работа для XSLT . И, конечно же, каждый должен знать об этом известном ответе 2009 года: RegEx соответствует открытым тегам, кроме автономных тегов XHTML .