Добавьте строку над определенным тегом XML и одну строку ниже конечного тега XML

1

У меня есть файл с содержимым, как показано ниже:

<root>
    <appender name="abc">
     some lines
    </appender>
    <appender name="def">
      some lines
    </appender>
    <appender name="qaz">
      some lines
    </appender>
</root>

Я хочу прокомментировать ниже:

  <!--
    <appender name="def">
      some lines
    </appender>-->

Что такое

sed -i '/<appender name="def"/s/^/<--/;/<\/appender>/s/$/-->/' file.xml

Это добавляет <!-- поверх <appender name="def"> но --> добавляется во все строки, где присутствует </appender>. Я хочу добавить --> только на </appender> которые получают поиск после первого совпадения.

Результат должен быть следующим:

<root>
    <appender name="abc">
     some lines
    </appender>
<!--
    <appender name="def">
      some lines
    </appender>-->
    <appender name="qaz">
      some lines
    </appender>
</root>

Я пробовал искать партии для подобных проблем, но не смог найти их.

  • 0
    Удалить элемент легко с помощью инструмента командной строки с поддержкой XML, такого как xmlstarlet. Комментировать это сложнее. См. Stackoverflow.com/questions/48671491/… .
Теги:

2 ответа

0

Ответ на dibery выглядит великолепно, но поскольку вы также отметили python, я предоставил простой скрипт, который сделает вашу работу.

with open("file.xml", "r") as r:
    lines = r.readlines()

gotcha = False                 # Just a flag to know if we catched the field
with open("file.xml", "w") as w:
    for k in range(len(lines)):
        if '<appender name="def">' in lines[k]:
            w.write("<!--\n") 
            gotcha = True      # We got it!
        w.write(lines[k])
        if '</appender>' in lines[k] and gotcha:
            w.write('-->\n')
            gotcha = False     # We have done our job, this avoids commenting every other '</appender>' field

Выход

<root>
    <appender name="abc">
     some lines
    </appender>
<!--
    <appender name="def">
      some lines
    </appender>
-->
    <appender name="qaz">
      some lines
    </appender>
</root>
  • 0
    это позаботится о закрытии файлового дескриптора. я выполняю скрипт постоянно в интервале, поэтому не должно быть никаких утечек FD.
  • 0
    Да, он закроет только файловый дескриптор <appender name = "def">. Все остальные остаются без изменений
0

Сохраните следующий process.awk

/<appender name="def">/ {
        show = 1
        print "<!--"
}

/<\/appender>/ {
        if( show == 1 )
        {
                $0 = $0 "-->"
                show = 0
        }
}

{
        print
}

и использовать

awk -f process.awk file.xml

Объяснение:

  1. Отметьте его, если появится желаемый шаблон, и распечатайте маркер комментария.
  2. Если появится окончательный шаблон, добавьте комментарий закрытия.
  3. Распечатайте измененную строку.

Для онлайн-отображения скрипт awk записывается в отдельный файл. Если вы предпочитаете, вы можете легко преобразовать его в встроенную версию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню