В случае, если кто-то столкнулся с той же проблемой с машинами 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), и теперь он работает, как и ожидалось.
Вы можете использовать " pcregrep "вместо grep, который поддерживает многострочные шаблоны и имеет больше параметров.
Этот шаблон находит две последовательные строки, содержащие теги open и close:
pcregrep -M -v "<headertag>\n\s*?</headertag>" file
этот шаблон удаляет все пустые теги.
Ваш 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/ ... но сначала проверьте, есть ли он в вашем менеджере пакетов по умолчанию.
Вы не сказали нам, что вы хотите сделать с пустыми тегами. Поэтому я предположу, что вы хотите преобразовать такие пары тегов в формат
Вот простой sed
скрипт, который сделает именно это для примера, который вы нам предоставили:
sed -E ':a;N;$! ba;s#<([^>]+)>\n\1>#<\1/>#g' infile > outfile
Предположения:
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