Sed - Как напечатать Regex группы в несколько строк? - PullRequest
3 голосов
/ 12 мая 2011

Входной файл (тест):

123456<a id="id1" name="name1" href="link1">This is link1</a>789<a id="id2"
href="link2">This is link2</a>0123

Желаемый вывод:

link1
link2

Что я сделал:

$ sed -e '/<a/{:begin;/<\/a>/!{N;b begin};s/<a\([^<]*\)<\/a>/QQ/;/<a/b begin}' test
123456QQ789QQ0123

Вопрос: Как вы печатаетегруппы регулярных выражений в sed ( multiline )?

1 Ответ

2 голосов
/ 12 мая 2011

Если вы используете sed следующим образом:

sed -e '/<a/{:begin;/<\/a>/!{N;b begin};s/<a\([^<]*\)<\/a>/\n/;/<a/b begin}'

, тогда он будет печататься в разных строках:

123456
789
0123

Но это то, что вы пытаетесь напечатать?Или вы хотите печатать текст в hrefs?

Обновление 1: чтобы получить hrefs между правильно сформированными <a и </a>

sed -r '$!N; s~\n~~; s~(<a )~\n\1~ig; s~[^<]*<a[^>]*href\s*=\s*"([^"]*)"[^\n]*~\1\n~ig' test

output

link1
link2

Обновление 2: получение указанного выше результата с помощью функции bash regex

regex='href="([^"]*)"'
while read line; do
   [[ $line =~ $regex ]] || continue
   echo ${BASH_REMATCH[1]}
done < test

output

link1
link2
...