Поиск и замените определенное значение тега в файле XML с помощью команды SED

На самом деле это может быть псевдоним. - color не обязательно должен быть в конце, а grep всегда выполняет поиск в текущем каталоге с помощью -r , если параметр каталога не задан (в минимум GNU grep ). Поэтому вы можете сделать:

alias mygrep='grep -rnIi --color'

Обновить

Поведение поиска в текущем каталоге по умолчанию было введено в GNU grep 2.11 . Из журнала изменений :

Если файловый операнд не указан и задана опция командной строки -r или эквивалентная , grep теперь выполняет поиск в рабочем каталоге. Раньше grep игнорировал -r и искал стандартный ввод нерекурсивно. -r, найденный в GREP_OPTIONS, не имеет этого нового эффекта.

Итак, в версиях > = 2.11 из GNU grep псевдоним будет следующим:

mygrep PATTERN [PATH...]

Для версий grep до этого , вам придется указывать путь каждый раз, когда @ slm answer использование функции - лучший способ. Хотя вы можете добиться того же использования, что и выше, написав функцию следующим образом:

mygrep () { grep -rnIi --color "$1" "${2:-.}"; }

Предполагая, конечно, что нет требования, чтобы - color был в конце, как в Q. ..

0
10.12.2018, 22:24
2 ответа

Используя XMLStarlet,и предполагая, что документ имеет корневой узел:

xmlstarlet ed \
    -u '//context-param[param-name = "com.sun.faces.numberOfViewsInSession"]/param-value[. = 25]' \
    -v 3 file.xml

Это выбирает правильный param-valueузел (тот, который имеет значение 25 (отбрасывает бит [. = 25], если старое значение неважно )и является дочерним узлом context-paramузел, param-nameдочерний узел которого имеет значение com.sun.faces.numberOfViewsInSession), и изменяет его значение на 3.

Результирующий документ будет (со вставленным фальшивым rootузлом):

<?xml version="1.0"?>
<root>
  <context-param>
    <param-name>com.sun.faces.sendPoweredByHeader</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>3</param-value>
  </context-param>
  <context-param>
    <param-name>testing</param-name>
    <param-value>25</param-value>
  </context-param>
</root>
3
28.01.2020, 05:05

Используя приведенную ниже команду sed, мы можем обновить конкретное значение тега:-

sed -i '/<param-name>com.sun.faces.numberOfViewsInSession<\/param-name>/{n;s/<param-value>3<\/param-value>/<param-value>25<\/param-value>/}' test.xml
-2
28.01.2020, 05:05

Теги

Похожие вопросы