sed для добавления строк в XML-файл - PullRequest
0 голосов
/ 24 января 2019

Привет, у меня есть файл xml. Я хочу добавить следующие теги, когда я вижу тег. Например

Я хочу добавить

<Context 
allowLinking="false"
privileged="false"
useHttpOnly="true"
xmlValidation="false">
</Context>

Файл выглядит так

<Context>
</Context>

После добавления должно понравиться это

<Context allowLinking="false"
privileged="false"
useHttpOnly="true"
xmlValidation="false">
</Context>

Я использовал следующую команду sed, но не могу добавить параметры внутри тега, как показано выше

Я попробовал следующий sed

grep 'allowLinking' /bao/tomcat/conf/context.xml
if [ $? -ne 0 ]
then    
    sed -i '/<Context .*?>/i allowLinking="false" \n privileged="false" \n useHttpOnly="true" \n xmlValidation="false"/' /tmp/context.xml
fi

Не могли бы вы, пожалуйста, дайте мне знать, как добавить содержимое.

Спасибо Динеш

1 Ответ

0 голосов
/ 24 января 2019

Вы можете попробовать:

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 .

...