Найти пустой тег в `xml` с помощью команды Unix

В случае, если кто-то столкнулся с той же проблемой с машинами Fedora 24 с последними обновлениями (на сегодняшний день), проблема, похоже, вовсе не в samba, а скорее в ошибке или неправильной настройке в настройках брандмауэра. При попытке подключения с использованием режима отладки уровня 3 на smbclient (-d3) я получаю следующие сообщения:

Подключение к 192.168.1.1 через порт 445

Подключение к 192.168.1.1 на порту 139

Подключение к 192.168.1.1 не удалось (Ошибка NT_STATUS_HOST_UNREACHABLE)

Поэтому из любопытства я пошел в утилиту брандмауэра моего сервера и обнаружил, что эти порты уже открыты (названные samba и samba-client), поэтому я попробовал с хорошим ol' disable-reenable, чтобы увидеть, работает ли он и получил следующую ошибку:

INVALID_HELPER: 'nf_conntrack_netbios_ns' недоступно в ядре.

Итак, видимо, какое-то обновление привело к тому, что мои правила брандмауэра отсутствовали или испортились, поэтому я приступил к ручному открытию указанных портов (445 и 139), и теперь он работает, как и ожидалось.

2
07.05.2017, 23:32
4 ответа

Вы можете использовать " pcregrep "вместо grep, который поддерживает многострочные шаблоны и имеет больше параметров.

Этот шаблон находит две последовательные строки, содержащие теги open и close:

pcregrep -M -v "<headertag>\n\s*?</headertag>" file
  • где -M означает многострочность
  • -v означает обратное совпадение
  • \ n - это символ новой строки, поддерживаемый в pcregrep, но не grep (я думаю )
  • \ s - это пробел.
  • *? любой символ

этот шаблон удаляет все пустые теги.

0
27.01.2020, 22:18

Ваш XML недействителен. Он использует \ вместо / в концевых тегах.

Чтобы разобрать XML, используйте инструмент с поддержкой XML. Я знаю, вы сказали, что у вас есть ограничения, связанные с системой, на которой вы работаете, но я собираюсь дать вам решение, которое будет работать, как только вы убедите своего менеджера/как угодно, что для надежной и прочной работы вам нужно установить XMLStarlet для правильного разбора XML.

С помощью XMLStarlet, учитывая XML файл,

<?xml version="1.0"?>
<root>
  <headertag>
    <subtag/>
  </headertag>
  <headertag>
    <subtag>Don't delete me!</subtag>
  </headertag>
  <headertag>
</headertag>
  <headertag>
Not empty
</headertag>
</root>

следующее удаление всех пустых тегов, независимо от того, как они называются или где в документе они встречаются:

$ xml ed -d '//*[not(normalize-space())]' file.xml >newfile.xml

$ cat newfile.xml
<?xml version="1.0"?>
<root>
  <headertag>
    <subtag>Don't delete me!</subtag>
  </headertag>
  <headertag>
Not empty
</headertag>
</root>

Команда xml иногда может называться xmlstarlet в зависимости от того, как она упакована в вашей системе.

XMLStarlet доступен здесь: http://xmlstar.sourceforge.net/ ... но сначала проверьте, есть ли он в вашем менеджере пакетов по умолчанию.

2
27.01.2020, 22:18

Вы не сказали нам, что вы хотите сделать с пустыми тегами. Поэтому я предположу, что вы хотите преобразовать такие пары тегов в формат

Вот простой sed скрипт, который сделает именно это для примера, который вы нам предоставили:

sed -E ':a;N;$! ba;s#<([^>]+)>\n#<\1/>#g' infile > outfile

1
27.01.2020, 22:18

Предположения:

  • Пустые теги, которые мы ищем, находятся в отдельной строке.
  • Закрывающий тег также стоит на отдельной строке + сразу за ним.
  • Предполагается, что пробелы состоят из пробелов, а не табуляции.

sed -ne '
   /^ *\(<[^><]*>\) *$/!d                                   # tag opening should be on a line of its own
   s//\1/                                                   # strip away all whitespace
   $d; N                                                    # if the tag opening is on the last line, we dont need it. Otherwise, we grab the next line
   s/^.\(.*\).\n *<\/\1> *$/Empty tag: <\1> on line num\#/p # print only in case the tagnames match across lines => we have found an empty tag
   /\n/!=                                                   # print empty tag line num
   D                                                        # delete the pattern space
' yourfile.xml
1
27.01.2020, 22:18

Теги

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