Что вы хотите сделать - удаление пробелов в начале и конце текста и свертывание любой последовательности пробелов и символов новой строки в один пробел внутри текста - это известно как нормализация пробелов в XML, и могут быть сделаны многими инструментами обработки XML из коробки без необходимости специального сценария оболочки. Например, вы можете использовать tidy
(доступно в http://tidy.sourceforge.net/ и может быть уже установлено на вашем компьютере или может быть установлено через sudo apt-get install tidy
в Debian / Ubuntu) следующим образом, чтобы нормализовать пробелы в вводе (предполагается, что он сохранен). в test.xml
):
tidy -xml -w 80 test.xml
Ваша строка в awk печатает любую строку ввода ($0
), пропускает символы новой строки (используя printf()
вместо print()
) и добавляет RS
(разделитель записей, символ табуляции по умолчанию) перед выходная строка, если строка начинается с тега начального элемента (/</
), но не похожа на тег конечного элемента (!/^<\//
). Два теста регулярного выражения объединяются с логическим и оператором &&
и являются частью условного выражения, в котором все перед символом ?
соответствует условию теста, а часть, следующая за ?
, представляет "if" и "else" Ветвь, соответственно, взять в зависимости от условного, разделенного :
. Для вашего ввода программа awk будет выводить все в одной строке (без завершающего символа новой строки), и перед каждым тегом начального элемента будет добавлен символ табуляции. Он не сможет разделить последовательные текстовые строки пробелом и неправильно передаст всю входную строку в качестве первого аргумента printf()
, так что процентный символ во входном тексте, интерпретируемый как плашечник в строках формата printf
, будет сломать ваш вывод.
Сделайте себе одолжение и используйте настоящие инструменты XML или SGML для обработки разметки.