2012-05-11 3 views
1

Я пишу небольшой скрипт, который анализирует rss с помощью xmllint.Bash script и xml/rss синтаксический анализ

Теперь я получать список титулов с помощью следующей команды:

ITEMS=`echo "cat //title" | xmllint --shell rss.xml ` 
echo $ITEMS > tmpfile 

Но он возвращает:

<title>xxx</title> ------- <title>yyy :)</title> ------- <title>zzzzzz</title> 

без символов новой строки, или пробелом. Теперь я заинтересован только в текстовое содержимое тегов заголовков, и, если это возможно, я хочу, чтобы перемещаться по заголовкам используя для/время цикла, что-то вроде:

for val in $ITEMS 
do 
     echo $val 
done 

Как это можно сделать? Заранее спасибо

+1

Не будьте мазохистом, используйте язык скриптов, такой как python, ruby, любой другой язык в мире, perl (в том порядке предпочтения: P) – KurzedMetal

+2

@KurzedMetal Вы можете делать много разбора и расщепления и итерации в bash. –

+0

Вы найдете, что цитирование ваших переменных поможет много: 'for val in" $ ITEMS "; do echo "$ val"; done' –

ответ

3

У меня был такой же тип требования в какой-то момент, чтобы разобрать xml в bash. Я закончил использовать xmlstarlet http://xmlstar.sourceforge.net/, который вы, возможно, сможете установить.

Если нет, то что-то подобное будет удалить теги surounding:

echo "cat //title/text()" | xmllint --shell rss.xml 

Тогда вы должны очистки на выход после того, как обжигающе его, основное решение будет:

echo "cat //title/text()" | xmllint --shell rss.xml | egrep '^\w' 

Надеется, что это help

2

Чтобы ответить на ваш первый вопрос, неупомянутое использование $ITEMS с echo устраняет ваши символы новой строки. Попробуйте

ITEMS=`echo "cat //title" | xmllint --shell rss.xml ` 
echo "$ITEMS" > tmpfile 
#----^------^--- dbl-quotes only 

В общем, с помощью for петли лучше оставить элементы, которые не будут генерировать неожиданные пробелы или другие непечатаемые символы. (Не буквенно-цифровые), как for i in {1..10} ; do echo $i; done

И вы на самом деле не нужны переменные, или временный файл, попробуйте

echo "cat //title" | xmllint --shell rss.xml | 
    while read line ; do 
     echo "$line" 
    done 

В зависимости от того, что в ваших РРП кормить, вы также можете воспользоваться изменяя по умолчанию IFS (Internal Field Separator), который используется для чтения ЦМД, попробуйте

while IFS= read line .... 
# or 
while IFS="\n" read line 
# or 
while IFS="\r\n" read line 

Я не уверен, что вы пытаетесь достичь с echo "cat //title" | вдаваясь в xmllint, поэтому я оставляю это как есть. Это инструкция для xmllint? или он прошел через создание заголовка для документа? (У вас нет xmllint для эксперимента с прямо сейчас).

Кроме того, вы можете посмотреть на reading rss feeds with awk, но это довольно низкий уровень.

Надеюсь, это поможет.

+0

yes - инструкция для xmllint, пожалуйста, проверьте, что я обновил вопрос, потому что я заметил, что какой-то charcater отсутствует в примере, который я предоставил. Спасибо: D – Ivan

+0

Я не вижу ничего другого между вашим новым размещением и тем, что я использовал в качестве вашей основной команды. Было ли изменение в cmd или в вашем токовом выходе вашего образца? ** Также я добавляю редактирование к моему ответу, вернитесь через минуту. ** Удачи. – shellter

+0

@ Ивана с моим редактированием. Удачи. – shellter

Смежные вопросы