Найдите строку в xml теге и удалите строку, которая является частью тега сравнения

Вы можете использовать SendEnv в вашем .ssh/config. Из man-страницы ssh_config:

SendEnv Указывает, какие переменные из локального окружения environ(7) должны быть переданы на сервер. Обратите внимание, что передача окружения поддерживается только для протокола 2. Сервер также должен поддерживать его, и сервер должен быть настроен на прием этих переменные окружения. Обратитесь к AcceptEnv в sshd_config(5), чтобы узнать, как настроить сервер. Переменные указываются по имени, которое может содержать символы подстановки. Несколько переменных окружения могут быть разделены пробелами или распределяться между несколькими директивами SendEnv. По умолчанию переменные окружения не отправляются.

0
08.02.2019, 14:08
2 ответа

Как правило, невозможно манипулировать XML с помощью таких инструментов, как sed, awkили grep. Для общего XML используйте библиотеку разбора XML.

Если ваш XML-файл всегда отформатирован одинаково, т. е. один тег в строке, такое же вложение тегов, как в вашем примере, это было бы возможно с awk.

awk  'BEGIN { institutionMatch=0; skipValue=0; }
/<oneFi institution="[^"]*">/ { institutionMatch=0; }      # assume other institution
/<oneFi institution="12345678">/ { institutionMatch=1; }   # relevant institution
/<value maxPAN="19" minPAN="4" prefix="528749"\/>/ { if(institutionMatch)
    skipValue=1;   # mark to skip if found in matching institution
}
{ if(!skipValue) { print; } skipValue=0; }' inputfile > outputfile

Примечание. :Этот сценарий может создавать мусор, если ваш XML-файл выглядит иначе, чем ваш пример.

0
28.01.2020, 02:30

Предполагая, что XML-документ действителен, например, как

<?xml version="1.0"?>
<root>
  <oneFi institution="12345678">
    <bin _list="1">
      <value maxPAN="19" minPAN="4" prefix="528749"/>
      <value maxPAN="19" minPAN="4" prefix="544448"/>
      <value maxPAN="19" minPAN="4" prefix="557231"/>
    </bin>
  </oneFi>
  <oneFi institution="854784662">
    <bin _list="1">
      <value maxPAN="19" minPAN="4" prefix="528749"/>
      <value maxPAN="19" minPAN="4" prefix="544448"/>
    </bin>
  </oneFi>
</root>

(в вашем примере отсутствует корневой узел)

Тогда вы можете использовать XMLstarlet:

$ xmlstarlet ed -d '//oneFi[@institution="12345678"]//value[@prefix="528749"]' file.xml
<?xml version="1.0"?>
<root>
  <oneFi institution="12345678">
    <bin _list="1">
      <value maxPAN="19" minPAN="4" prefix="544448"/>
      <value maxPAN="19" minPAN="4" prefix="557231"/>
    </bin>
  </oneFi>
  <oneFi institution="854784662">
    <bin _list="1">
      <value maxPAN="19" minPAN="4" prefix="528749"/>
      <value maxPAN="19" minPAN="4" prefix="544448"/>
    </bin>
  </oneFi>
</root>

Выражение XPATH //oneFi[@institution="12345678"]//value[@prefix="528749"]будет соответствовать узлу, который вы упомянули в вопросе, используя атрибут institutionузла oneFiи атрибут prefixузла valueгде-то под выбранным oneFiузел.

Если вам нужно уточнить значения атрибутов узла value, тогда вы можете сопоставить и другие атрибуты, используя

value[@prefix="528749" and @maxPAN="19" and @minPAN="4"]

в этой части выражения.

Битed -d(илиed --delete)команды XMLstarlet означает, что утилита должна редактировать документ XML и удалять узлы, соответствующие выражению.

2
28.01.2020, 02:30

Теги

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