Как раскомментировать xml-узел из командной строки?

#xml #regex #command-line #sed #awk

#xml #регулярное выражение #командная строка #sed #awk

Вопрос:

Регулярное выражение для выбора нужного узла будет примерно таким:

 <!--s*<env-entry>(.*s*)*</env-entry>s*-->
  

где XML-файл содержит:

 <!--
    <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>/put/your/solr/home/here</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
   -->
<!--
    <other-entry>
    </other-entry>
   -->
  

Как мне раскомментировать выбранный узел (возможно, с помощью sed / awk)?

Комментарии:

1. 1. sed требует управления соединением нескольких строк, прежде чем вы сможете сопоставить регулярное выражение в соответствии с вашим примером, упражнение только для храбрецов, у которых есть свободное время. вероятно, awk может это сделать. 2. Я заметил, что в некоторых других ваших сообщениях используется xmlstarlet. Разве это не может этого сделать? 3. Вы уверены, что задаете правильный вопрос? Такое ощущение, что вам действительно нужен способ создания специальных cfg-файлов из основного cfg-файла. Я думаю, что существует множество инструментов, которые можно использовать для этого подхода (но у меня нет опыта работы с ними). Удачи!

Ответ №1:

Вот грубое решение, в нем могут быть ошибки в угловых случаях, поэтому тщательно протестируйте его:

 /<!--/ {
    comment = $0
    getline
    if ($0 !~ /<env-entry>/) print comment
}

/-->/ {
    if (last_line ~ /</env-entry>/) next
}

{
    last_line = $0
    print
}
  

ОБНОВЛЕНИЕ: я забыл упомянуть, что решение находится в AWK, на всякий случай.