Найти шаблон в XML с помощью команды unix

У меня есть XML, как показано ниже.

<a> </a> <a> <b></b> <c></c> </a> 

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

  <a> </a> Output: 1 -> line number 

Я использую PCGREP, но мои администраторы unix ограничили или не поддерживали команды perl, поэтому это может быть достигнуто с помощью SED или AWK? Примечание: xmlstarlet также не поддерживается.

  • Есть ли какие-либо инструменты, которые позволят мне проверить длину строки XML-узла
  • создать файл XML с помощью сценария bash
  • Анализ XML, JSON и новых форматов файлов данных в UNIX с помощью служебных программ командной строки
  • Как вставить переменные внутри строки, содержащей ""?
  • Используйте инструменты Unix для поиска блока определений в XML.
  • Bash / Linux Инструменты для исправления xml
  • VIM переходит от одного тега xml к закрытию
  • Вставить многострочную строку в другую строку
  • One Solution collect form web for “Найти шаблон в XML с помощью команды unix”

    Sed раствор

     #!/bin/bash sed -nr ' /^<[^<]*>$/ { N /^<([^<]*)>\n<\/\1>$/= } ' "$1" | awk '{print "Output: "$NF - 1" -> line number"}' 

    Объяснение:

    1. sed
      • /^<[^<]*>$/ если у нас есть один открытый тег в строке
      • N – добавьте следующую строку ввода в пространство шаблонов.
      • /^<([^<]*)>\n<\/\1>$/ и проверить, имеет ли следующая строка эквивалентный закрытый тег.
      • если это так, напечатайте этот номер строки командой = . Имейте в виду, что это номер строки закрытого тега. Мы должны уменьшить его на один.
    2. awk – уменьшает номер строки и печатает ее в строке сообщения.

    Тестирование:

    вход

     <a> </a> <a> <b></b> <c></c> <c> </c> </a> 

    Вывод

     ./empty_tag.sh input.txt Output: 1 -> line number Output: 6 -> line number 

    Решение AWK

    Использование: ./empty_tag.sh input.txt

     #!/bin/bash awk -F'[>/]' ' line_num { if(NF == 3) {print "Output: " line_num " -> line number";} line_num = 0; } NF == 2 {line_num = NR;} ' "$1" 
    Linux и Unix - лучшая ОС в мире.