У меня есть очень большой файл HTML (около 20 МБ), и мне нужно удалить из файла большое количество узлов вида:
<tr><td>SPECIFIC-STRING</td><td>RANDOM-STRING</td><td>RANDOM-STRING</td></tr><tr><td style = "padding-top:0" colspan = "3">RANDOM-STRING</td></tr>
Файл, над которым мне нужно работать, в основном состоит из тысяч этих строк, и мне нужно удалить только те, у которых есть определенная первая строка, например, все те, у которых первой строкой является «банан»:
<tr><td>banana</td><td>RANDOM-STRING</td><td>RANDOM-STRING</td></tr><tr><td style = "padding-top:0" colspan = "3">RANDOM-STRING</td></tr>
Я попытался добиться этого, открыв файл в Geany и используя функцию замены с этим регулярным выражением:
<tr><td>banana</td><td>(.*)</td><td>(.*)</td></tr><tr><td(.*)</td></tr>
но вывод консоли состоял в том, что она удалила количество вхождений X, когда я знаю, что вхождений намного больше, чем в файле. Firefox, Chrome и Brackets не могут даже просмотреть html-код файла из-за его размера. Я не могу придумать другого способа сделать это из-за моего большого отсутствия опыта работы с HTML.
Вы можете использовать потоковый редактор, который, как следует из названия, выполняет потоковую передачу содержимого файла, поэтому никогда не загружает весь файл в основную память.
Популярный редактор — sed
. Он поддерживает RegEx.
Ваша команда будет иметь следующую структуру.
sed -i -E 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-E
за поддержку расширенного RegEx-i
для режима редактирования на местеs
означает, что вы хотите заменить значенияg
для global
. По умолчанию sed
заменяет только первое вхождение, поэтому для замены всех вхождений вы должны предоставить g
SEARCH_REGEX
— это RegEx, который вам нужен для поиска подстрок, которые вы хотите заменитьREPLACEMENT
— это значение, которым вы хотите заменить все совпаденияINPUTFILE
— это файл, который sed
будет читать построчно и делать замену за вас.Хотя регулярное выражение может быть не лучшим инструментом для выполнения такой работы, попробуйте эту настройку вашего шаблона:
<tr><td>banana</td><td>(.*?)</td><td>(.*?)</td></tr><tr><td(.*?)</td></tr>
Это делает ваши .*
совпадения ленивыми. Мне интересно, не потребляют ли эти шаблоны слишком много.
Возможно, вам придется найти способ сделать это в терминале таким образом, чтобы свести к минимуму накладные расходы памяти на загрузку файла. Как, могу я спросить, вы получили 20-мегабайтный HTML-файл?