LINUX.ORG.RU

[sed][bash][whatever] Как выдрать HTML-тег, который содержит в себе ключевое слово?

 ,


0

1

Допустим, есть

<tr>
    <td>некий текст</td>
    <td>значение</td>
</tr>
<tr>
    <td>КЛЮЧЕВОЕ_СЛОВО</td>
    <td>ИСКОМОЕ_ЗНАЧЕНИЕ</td>
</tr>
<tr>
    <td>некий текст</td>
    <td>значение</td>
</tr>
<tr>
    <td>некий текст</td>
    <td>значение</td>
</tr>
Я хочу выдрать содержимое тега <tr>, в котором есть КЛЮЧЕВОЕ_СЛОВО, тогда я смогу отпарсить и найти искомое значение. Но я уже поломал себе мозг.

Есть переносы \r\n

Пока придумал, как выдирать все теги <tr>

sed -n -e '/<tr>/, /<\/tr>/ p'
Вывести отдельно строку с содержимым в sed тоже просто. А вот как сделать более умный паттерн или перенаправить найденный паттерн сразу другой комманде sed (отдавая не весь результат, а только по кускам!), чтобы в нём отсеять на наличие КЛЮЧЕВОГО_СЛОВА и вывести только подходящий кусок - пока не разобрался.

В идеале хочется получить

cat file | sed 'жуткая уличная магия'
ИСКОМОЕ ЗНАЧЕНИЕ
Но можно и попроще:
cat file | sed 'жуткая уличная магия'
<tr>
    <td>КЛЮЧЕВОЕ_СЛОВО</td>
    <td>ИСКОМОЕ_ЗНАЧЕНИЕ</td>
</tr>
Можно и без тегов tr.

Есть идеи, как это сделать?

возьми перл html::dom или питон, пхп, ... аналоги , и не мучайся

ELF ★★
()

Пока сделал [code] grep -i -A2 КЛЮЧЕВОЕ СЛОВО index.html | grep -v td | tr -d '\t ' [/code]

Chaser_Andrey ★★★★★
() автор топика

> cat file | sed 'жуткая уличная магия'

$ cat ./test.txt | sgrep '"<tr>".."</tr>" containing ("КЛЮЧЕВОЕ_СЛОВО")'
Neksys ★★★
()

> Можно и без тегов tr

$ cat ./test.txt | sgrep '"<tr>"__"</tr>" containing ("КЛЮЧЕВОЕ_СЛОВО")' 
Neksys ★★★
()

В идеале хочется получить

$ cat ./test.txt | sgrep '"<tr>".."</tr>" containing ("КЛЮЧЕВОЕ_СЛОВО")' | sgrep '"<td>".."</td>" not  containing ("КЛЮЧЕВОЕ_СЛОВО")'
<td>ИСКОМОЕ_ЗНАЧЕНИЕ</td>
Neksys ★★★
()

Дальше наблюдаем глюк:

$ cat ./test.txt | sgrep '"<tr>".."</tr>" containing ("КЛЮЧЕВОЕ_СЛОВО")' | sgrep '"<td>"__"</td>" not containing "КЛЮЧЕВОЕ_СЛОВО"'
КЛЮЧЕВОЕ_СЛОВОИСКОМОЕ_ЗНАЧЕНИЕ

И что с... характерно

$ cat ./test.txt | sgrep '"<tr>".."</tr>" containing ("СЛОВО")' | sgrep '"<td>"__"</td>" not containing ("КЛЮЧЕВОЕ")'                                                                                                               
ИСКОМОЕ_ЗНАЧЕНИЕ
$ cat ./test.txt | sgrep '"<tr>".."</tr>" containing ("КЛЮЧЕВОЕ")' | sgrep '"<td>"__"</td>" not containing ("СЛОВО")'                                                                                                               
ИСКОМОЕ_ЗНАЧЕНИЕ
$ cat ./test.txt | sgrep '"<tr>".."</tr>" containing ("СЛОВО")' | sgrep '"<td>"__"</td>" not containing ("СЛОВО")'                                                                                                                  
ИСКОМОЕ_ЗНАЧЕНИЕ
$ cat ./test.txt | sgrep '"<tr>".."</tr>" containing ("КЛЮЧЕВОЕ")' | sgrep '"<td>"__"</td>" not containing ("КЛЮЧЕВОЕ")'                                                                                                            
ИСКОМОЕ_ЗНАЧЕНИЕ

Вот такие пироги.

P.S. Это не спам. :)

Neksys ★★★
()
Ответ на: комментарий от Neksys

Спасибо, выглядит впечатляющее лаконично и просто!

Chaser_Andrey ★★★★★
() автор топика

можно и с sed'ом - но вот такой вариант:


grep -A 1 КЛЮЧЕВОЕ_СЛОВО file|tail -n 1|cut -d">" -f2|cut -d"<" -f1

s1392781
()
Ответ на: комментарий от Deleted

Два коктейля этому господину, я эту ссылку где-то заиграл.

GateKeeper ★★
()
Ответ на: комментарий от Deleted

О, благодарю, сударь! Это действительно дает ответы на все мои вопросы!

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от softinfo

в awk инструкция если $1 (предположим, что КЛЮЧЕВОЕ СЛОВО первое) = КЛЮЧЕВОЕ СЛОВО print $2 удаляем закрывающий тег </td> sed'ом всё. искомое у вас

softinfo
()
Ответ на: комментарий от softinfo

Спасибо, думаю, этому способу тоже найдется применение.

Chaser_Andrey ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.