awk для сопоставления и вырезания полей с чередующимся разделителем

пример файла закладок

Я хотел бы использовать awk или аналогичные шаблоны соответствия файла хромовых закладок и в зависимости от соответствия вырезать определенное поле на основе разных разделителей полей.

Я приложил образец изображения. Я до сих пор не понял, как приложить как файл, пожалуйста, несите меня.

Я хочу, чтобы имена папок совпадали, если строка H3 была сопоставлена, и URL-адрес в случае, HREF встречается строка HREF .

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

 awk -F'[<>]' '/H3/{print $5}' bookmarks.htm awk -F'"' '/HREF/{print $2}' bookmarks.html 

Моя цель состоит в том, чтобы объединить два вышеприведенных утверждения, чтобы выход был следующим:

 UNIX url-1 url-2 OCE url-3 url-4 url-5 ANDROID url-6 url-7 

Я пробовал awk , если бы, тогда, еще, но не был окончательным.

Как достичь этого как однострочного? есть ли лучшие кандидаты, чем awk ? python, perl оба были бы хороши, однако однострочный шрифт является абсолютным, так как было бы легкой задачей написать сценарий оболочки, выполняющий эту работу.

Это неправильный способ обработки html-файлов с помощью sed / awk / … Существует несколько специальных парсеров, но в качестве временной замены

 sed ' /\n/{P;d;} /<H3/s/[><]/\n/4g /HREF/s/"/\n/g D ' bookmarks.htm 

Для не-GNU версий sed :

 sed ' /\n/{P;d;} #if there is more then 1 line «P»rint 1st line then «d»elete all /<\/H3/s//\n/ #replace «</H3» by «\n»ewline /\n/s/">/\n/ #replace «">» by «\n»ewline if previous command is executed /HREF/s/"/\n/g #put «\n»ewline» around url if «HREF» in line D #«D»elete 1 first line, go to start ' bookmarks.htm 

Использование анализатора xml / html имеет ряд преимуществ. Выражения Xpath – это стандартный способ выбора определенных частей.

xml + xmlstarlet + xpath

Если ввод хорошо сформирован xml, мы можем использовать выражение xmlstarlet + xpath:

 xmlstarlet sel -t -v '//h3|//a/@href' -nl bookmarks.html 

html + xmllint: xml

Если вход является действительным только html, мы можем преобразовать его в xml (используя xmllint ) и использовать предыдущее:

 xmllint -html -xmlout ex.html | xmlstarlet sel -t -v '//h3|//a/@href' -nl - 

xmllint + xpath

Мы можем использовать выражение xmllint + xpath, непосредственно

 xmllint -html -xpath '//h3/text()|//a/@href' bookmarks.html 

… но формат вывода – это не то же самое …

Один последний ответ: на этот раз один-ligner perl

 perl -nE 'say $1 if (/<h3.*?>(.*?)<\/h3>/i or /href="(.*?)"/i)' ex.html 

(Я считаю, что решения на основе XML-анализа лучше, но поскольку у вас есть файл с инструментами, количество сюрпризов не должно быть очень высоким)

На данный момент я отказался от спроса на один лайнер и вместо этого сделал это как скрипт.

Я должен был опубликовать это как ответ, поскольку это было бы слишком долго для комментария. Тем не менее, не стесняйтесь отвечать.

Этот скрипт выполняет эту работу, но слишком вялый, может ли кто-нибудь ускорить его или, наоборот, предложить однострочный?

 #!/bin/sh file=$1 while IFS= read -r line do hdr=$(echo $line | awk -F'[<>]' '/H3/{print $5}') url=$(echo $line | awk -F'"' '/HREF/{print $2}') if [ ${url} ]; then echo $url elif [ ${hdr} ]; then echo $hdr fi done <"$file" 

Вот файл: (наконец, получил его)

 <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h1>Bookmarks</h1> <dl> <dd> <DT><H3 ADD_DATE="1484311924" LAST_MODIFIED="1485532328">UNIX</H3> <dl> <dt><a HREF="http://unix.stackexchange.com/questions/223182/how-to-replace-spaces-in-all-file-names-with-underscore-in-linux-using-shell-scr" add_date="1484311897">url-1</a></dt> <dt><a HREF="http://unix.stackexchange.com/questions/81349/how-do-i-use-find-when-the-filename-contains-spaces" add_date="1484738308">url-2</a></dt> </dl> </dd> <dd> <DT><H3 ADD_DATE="1486550854" LAST_MODIFIED="1487228526">OCE</H3> <dl> <dt><a HREF="http://www.oraclecertificationprep.com/apex/f?p=OCPSG%3AEXAM_DETAILS%3A%3A%3ANO%3A%3AP2_EXAM%3A1Z0-061" add_date="1486550866">url-3</a></dt> <dt><a HREF="http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=303&amp;p_certName=SQ1Z0_047" add_date="1486550898">url-4</a></dt> <dt><a HREF="https://www.quora.com/How-do-you-prepare-for-an-Oracle-Database-SQL-exam" add_date="1486550950">url-5</a></dt> </dl> </dd> <dd> <DT><H3 ADD_DATE="1487084050" LAST_MODIFIED="1487228595">ANDROID</H3> <dl> <dt><a HREF="https://material.io/guidelines/style/color.html#" add_date="1487228526">url-6</a></dt> <dt><a HREF="https://developer.android.com/index.html" add_date="1487228539">url-7</a></dt> </dl> </dd> </dl> </body> </html>