lynx -dump
для преобразования HTML в обычный текст, а затем awk
для переформатирования вывода, устанавливая разделитель полей на новую строку (\n
) и разделитель записей на две или более новых строк (\n\n+
).
Вызовы функции sub()
в сценарии awk
удаляют лишние пробелы перед печатью требуемого вывода.
$ lynx -dump ramp.html |
awk -v RS='\n\n' -F'\n' '/^[[:space:]]+/ {
sub(/^ +/,"",$1);
sub(/ +/," ",$2);
print $1":"$2
}'
Commodity Orgin: uerb45e001.material.com
Commodity Code & Dimension: 151151.15 Dim 90
Commodity Serial #: 2009081020
Client Name: Jack
Мне очень не нравится это делать, потому что никогда не стоит разбирать XML или HTML с помощью регулярных выражений. Это не работает. Даже если вам удастся взломать его так, чтобы казалось, что он работает, он чрезвычайно хрупок и БУДЕТ ломаться, как только HTML или XML достаточно изменится по сравнению с тем, что ищут ваши регулярные выражения. Настоящий парсер XML или HTML - это единственная вещь, которая может сделать эту работу должным образом.
Но, учитывая это, вот кое-что, использующее только sed
и fmt
, инструменты, которые должны быть доступны в любой unix-подобной системе:
$ sed -e '/]*>//g;
s/^ *//;
/^\(Commodity\|Client\)/ s/$/:/' ramp.html |
fmt |
sed -e '/^[[:blank:]]*$/d'
Commodity Orgin: uerb45e001.material.com
Commodity Code & Dimension: 151151.15 Dim 90
Commodity Serial #: 2009081020
Client Name: Jack
Первый сценарий sed
удаляет все строки кроме пустых строк и строк, содержащих тег или
, затем удаляет все HTML-теги из входных данных, удаляет ведущие пробелы и добавляет
:
в конец строк имени поля. Вывод из sed
затем передается в fmt
для переформатирования строк, затем снова в sed
для удаления пустых строк.
Это хак, и он гарантированно будет работать только на том образце входных данных, который вы предоставили. Все, что существенно отличается, скорее всего, приведет к поломке скрипта. Вот что происходит, когда вы используете регулярные выражения для разбора любого, кроме самого тривиального HTML или XML.