LINUX.ORG.RU

Убрать строки (grep sed awk)

 , ,


0

1

Доброго времени суток!

В общем проблема такая, есть html файл из которого необходимо убрать мусор. Вот пример куска кода:

                            <li>
                                <div class="high">
                                    <a class="link"
                                       href="">blablabla</a>
                                    (8.3)
                                </div>
                                <div class="desc"></div>
                            </li>
                        
                            <li>
                                <div class="high">
                                    <a class="link"
                                       href="https://example.com">NAME</a>
                                    (8.3)
                                </div>
                                <div class="desc">TEST</div>
                            </li>
                            
                             <li>
                                <div class="high">
                                    <a class="link"
                                       href="">blablabla</a> High
                                    (8.1)
                                </div>
                                <div class="desc"></div>
                            </li>

И вопрос в том как из фала убрать вот такой кусок кода

                            <li>
                                <div class="high">
                                    <a class="vuln_link"
                                       href="">blablabla</a>
                                    (8.3)
                                </div>
                                <div class="desc"></div>
                            </li>

Чтоб фактически кусок с ссылкой, названием и описанием остался

                            <li>
                                <div class="high">
                                    <a class="link"
                                       href="https://example.com"> NAME </a>
                                    (8.3)
                                </div>
                                <div class="description">TEST TEST TEST TEST</div>
                            </li>
                            

Была идея отгрепать:

grep -v -A 4 -B 4 'href="">'

Но с ключом -v не работает -A 4 -B 4


Ну так и опиши URL в regexp'e чуть подробнее, остальные варианты отсеются.

rain@walkbook:/tmp$ grep -A 4 -B 4 'href="https://' html

                            <li>
                                <div class="high">
                                    <a class="link"
                                       href="https://example.com">NAME</a>
                                    (8.3)
                                </div>
                                <div class="desc">TEST</div>
                            </li>
rain@walkbook:/tmp$


Остальное добавить по желанию / необходимости.

YAR ★★★★★
()
Последнее исправление: YAR (всего исправлений: 1)

Нет, sed, awk и grep не предназначены для разбора HTML. Хотя sed и является Тьюринг-полным, основное его назначение — работа с регулярными языками, то, что можно описать регулярным выражением.

anarquista ★★★★★
()

Как насчет выбрать нужное через xpath при помощи какого-нибудь инструмента для работы с xml (xmllint например), а потом сформировать новый html например воткнув переменные в шаблон?

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

Ничего не понял. «Чтоб фактически кусок с ссылкой, названием и описанием остался» - ок, в моем примере именно он и остался. «добавлять потом остальное» - что ты собрался «добавлять»?

В общем, внятно опиши, что ты хочешь.

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

В общем помимо этого куска:

                            <li>
                                <div class="high">
                                    <a class="link"
                                       href="">blablabla</a>
                                    (8.3)
                                </div>
                                <div class="desc"></div>
                            </li>
                        
                            <li>
                                <div class="high">
                                    <a class="link"
                                       href="https://example.com">NAME</a>
                                    (8.3)
                                </div>
                                <div class="desc">TEST</div>
                            </li>
                            
                             <li>
                                <div class="high">
                                    <a class="link"
                                       href="">blablabla</a> High
                                    (8.1)
                                </div>
                                <div class="desc"></div>
                            </li>

там еще несколько сотен строк кода, поэтому грепать только эту часть никак не вариант.

Я поэтому и привел пример:

grep -v -A 4 -B 4 'href="">'

Ну раз уж он c -v не работает, то и подумал, что можно через sed/awk что-то подобное сообразить.

r4w3e5
() автор топика

делай в два прохода

в первом (awk) идешь по строкам

  • нашел «li» – запомнил номер строки, выставил флаг N1 Проверять-HREF-до-закрывающего-LI
  • если флаг N1 , то проверить HREF и выставить флаг Need-to-Delete
  • нашел «/li» и флаг Need-to-Delete – печатать номера строк для удаления («li», «/li»)

во втором проходе по номерам строк удалить от и до.

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)