Кажется, когда Вы делаете следующее:
VAR=
test -n $VAR && echo helloworld
Это рассматривает его, как будто аргумент не там:
test -n && echo helloworld
И, по некоторым причинам, когда аргумент не предоставляется, он всегда выполняет команду впоследствии (т.е. он отображает helloworld). Я попробовал это на другом unuary операторе, и он сделал то же самое:
FILENAME=
test -f $FILENAME && echo helloworld
Я думаю, хотите ли Вы ожидать поведение, необходимо заключить аргумент в кавычки:
VAR=
test -n "$VAR" && echo helloworld
FILE=
test -f "$FILE" && echo helloworld
Вышеупомянутые урожаи никакое сообщение, отзывающееся эхом на экран.
Относительно этого ожидаемое поведение? Я не могу найти его в документации нигде, но, это кажется довольно восстанавливаемым и последовательным.
Текстовые утилиты работают над строками (текст строка быть (не слишком долго) последовательности non-NUL символов, завершенных символом новой строки). awk
одна стандартная утилита, которой можно сказать работать зарегистрированная разделенный другими вещами, чем символы новой строки, вот почему awk
переговоры о записях вместо строк.
Например, Вы могли использовать >
как разделитель записей. Как в:
awk -v RS='>' ...
Другой подход должен подкачать символ, который Вы хотите использовать в качестве разделителя записей (для других инструментов, чем awk
) с символом новой строки:
... |
tr '\n>' '>\n' |
sed ... |
other-text-utility... |
tr '\n>' '>\n'
Они предполагают, что вещи, которые Вы хотите изменить, не включают вложенные HTML-тэги, поскольку они запустили бы новые записи.
Это - замена
Простой ответ: не используйте оболочку для парсинга XML. Используйте синтаксический анализатор XML вместо этого, например, один из многочисленных для Perl: XML:: Синтаксический анализатор, XML:: Простой, или любой другой язык. Для HTML, HTML:: Синтаксический анализатор является опцией (если мы остаемся с Perl).
Если Вы хотите использовать bash
, можно играть с read
встроенный и цикл немного.