Помощь с регулярным выражением Sed: извлечь текст из конкретного тега - PullRequest
1 голос
/ 27 января 2010

Первый раз, седье, так что будь нежным.

У меня есть следующий текстовый файл 'test_file':

 <Tag1>not </Tag1><Tag2>working</Tag2>

Я хочу извлечь текст между <Tag2>, используя sed regex, могут быть другие случаи <Tag2>, и я хотел бы также извлечь их.

Пока у меня есть регулярное выражение на основе sed:

cat test_file | grep -i "Tag2"| sed 's/<[^>]*[>]//g'

, который дает вывод:

 not working

Кто-нибудь знает, как заставить это работать?

Ответы [ 4 ]

4 голосов
/ 27 января 2010

Для вашего приятного, дружеского примера вы можете использовать

sed -e 's/^.*<Tag2>//' -e 's!</Tag2>.*!!' test-file 

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

4 голосов
/ 27 января 2010

Как сказал другой автор, sed, возможно, не лучший инструмент для этой работы. Возможно, вы захотите использовать что-то, созданное для разбора XML, или даже простой язык сценариев, такой как perl.

Проблема с вашей попыткой в ​​том, что вы неправильно анализируете строку.

cat test_file хорошо - распечатывает содержимое файла на стандартный вывод.

grep -i "Tag2" в порядке - он печатает только строки с "Tag2" в них. Это может быть не совсем то, что вы хотите. Имейте в виду, что он напечатает всю строку , а не только часть , поэтому вам все равно придется искать эту часть позже.

sed 's/&lt;[^&gt;]*[&gt;]//g' не то, что вам нужно - он просто удаляет теги, включая и .

Вы можете попробовать что-то вроде:

cat tmp.tmp | grep -i tag2 | sed 's/.*<Tag2>\(.*\)<\/Tag2>.*/\1/'

Это даст

working

но он будет работать только для одной пары тегов.

0 голосов
/ 08 февраля 2010
awk -F"Tag2" '{print $2}' test_1 | sed 's/[^a-zA-Z]//g'
0 голосов
/ 28 января 2010

вы можете использовать gawk, например,

$ cat file
 <Tag1>not </Tag1><Tag2>working here</Tag2>
 <Tag1>not </Tag1><Tag2>
working

</Tag2>

$ awk -vRS="</Tag2>" '/<Tag2>/{gsub(/.*<Tag2>/,"");print}' file
working here

working
...