sed, чтобы соответствовать нескольким строкам, но только после того, как определенная строка была замечена - PullRequest
1 голос
/ 30 сентября 2011

Я пытаюсь сделать очень простой анализ rss с помощью sed.Как выщипывание URL-адресов для прослушивания последних новостей.Пример:

sed -n -e 's/.*"\([^"]*\.mp3\)".*/\1/p' -e 's/.*<title>\([^<]*\)<.title>.*/\1/p'

Хотя я хотел бы начать сопоставление только после того, как был замечен определенный токен, в данном случае «», чтобы я не поймалfeed s или что-то подобное.

GNU sed - это нормально, и я думаю, что я мог бы как-то использовать двухадресную форму '0, / REGEXP /', но я не знаю, как объединить этодостичь вышеупомянутого

Добавлено для Dawnofthedead:

foo
bar
baz
<title>fum</title>
baz
fie
<item>
  <title>1</title>
  <enclosure url="one.mp3">
</item>
<item>
  <title>2</title>
  <enclosure url="two.mp3">
</item>

должно дать мне

1
one.mp3
2
two.mp3

Ответы [ 4 ]

2 голосов
/ 30 сентября 2011

если вы придерживаетесь sed, попробуйте эту строку. эта строка работает с данным примером:

kent$  sed -nr '/<item>/,/<\/item>/p' yourFile|sed -nr '/<title>/{s#[ ]*<[/]?title>##g;p}; /<enclosure/{ s#.*url="(.*)">#\1#g;p}'

тест

kent$  cat t
foo
bar
baz
<title>fum</title>
baz
fie
<item>
  <title>1</title>
  <enclosure url="one.mp3">
</item>
<item>
  <title>2</title>
  <enclosure url="two.mp3">
</item>

kent$  sed -nr '/<item>/,/<\/item>/p' t |sed -nr '/<title>/{s#[ ]*<[/]?title>##g;p}; /<enclosure/{ s#.*url="(.*)">#\1#g;p}'
1
one.mp3
2
two.mp3
1 голос
/ 30 сентября 2011
$ sed -n -f s.sed input
1
one.mp3
2
two.mp3

где s.sed равно:

/<item>/,/<\/item>/{
    s/^.*>\([^<]\+\).*$/\1/
    s/^.*"\(.*\)".*$/\1/
    />$/d
    p
}
0 голосов
/ 17 марта 2012

Это может сработать для вас:

sed '$!N;s/^\s*<title>\(.*\)<\/title>\n\s*<enclosure url="\([^"]*\)">/\1\n\2/p;D' file
1
one.mp3
2
two.mp3

Вместо того, чтобы смотреть между <item>...</item> s, ищите две строки <title>...<enclosure...

0 голосов
/ 30 сентября 2011

Если вам нужно проанализировать простой XML (например, канал RSS) в командной строке, почему бы вам не попробовать xsltproc ?

Он принимает на входе XML и может применитьтаблица стилей преобразования xslt.Вам нужно выучить язык xslt, но вы сможете получить лучший результат.

...