разбить файл на одну строку и обработать результирующие строки - PullRequest
0 голосов
/ 22 мая 2011

У меня есть XML-фид ( this ) в одной строке, поэтому для извлечения необходимых мне данных я могу сделать что-то вроде этого:

sed -r 's:<([^>]+)>([^<]+)</\1>:&\n: g' feed | sed -nr '
    /<item>/, $ s:.*<(title|link|description)>([^<]+)</\1>.*:\2: p'

, поскольку я не могу найти способ сделать первый sed вызов для обработки результата в виде разных строк.

Любой совет?

Моя цель - собрать все необходимые данные за один sed звонок

Ответы [ 3 ]

2 голосов
/ 22 мая 2011
sed -rn -e 's|>[[:space:]]*<|>\n<|g
/^<title>/ { bx }
/^<description>/ { b x }
/^<link>/ { bx }
D
:x
s|<([^>]*)>([^\n]*)</\1>|\1=\2|;
P
D' rss.xml

Новый ответ на новый вопрос.Теперь с ответвлениями и выводом всех трех порций информации.

1 голос
/ 22 мая 2011
sed -rn -e 's|>[[:space:]]*<|>\n<|g   # Insert newlines before each element
/^[^<]/ D                             # If not starting with <, delete until 1st \n and restart
/^<[^t]/ D                            # If not starting with <t, ""
/^<t[^i]/ D                           # If not starting with <ti, ""
/^<ti[^t]/ D
/^<tit[^l]/ D
/^<titl[^e]/ D
/^<title[^>]/ D                       # If not starting with <title>, delete until 1st \n and restart
s|^<title>||                          # Delete <title>
s|</title>[^\n]*||                    # Delete </title> and everything after it until the newline
P                                     # Print everything up to the first newline
D' rss.xml                            # Delete everything up to the first newline and restart

Под «перезапуском» я имею в виду возврат к началу сценария sed и представьте, что мы просто читаем все, что осталось.

Я много узнал о написании этого текста. Тем не менее, нет никаких сомнений в том, что вы действительно должны делать это в Perl (или в awk, если вы старой школы).

В Perl это будет perl -pe 's%.*?<title>(.*?)</title>(?:.*?(?=<title>)|.*)%$1\n%g' rss.xml

Что в основном использует преимущество минимального соответствия (. *? Не является жадным, оно будет соответствовать наименьшему количеству возможных символов). Позитивный взгляд в конце состоит в том, чтобы я мог сделать это в одном выражении, все еще удаляя все в конце. Есть несколько способов ...

Если вам нужно несколько тегов из этого XML-файла, это, вероятно, все еще возможно, но, вероятно, потребует разветвления и т. П.

0 голосов
/ 22 мая 2011

Что по этому поводу:

sed -nr 's|>[[:space:]]*<|>\n<|g
    h
    /^<(title|link|description)>/ {
        s:<([^>]+)>([^<]+)</\1>:\2: P
    }
    g
    D
    ' feed
...