Как вывести строки с помощью find и sed в нескольких файлах?

Как вывести строки с помощью find и sed в нескольких файлах?

У меня много файлов в структуре каталогов. Я хочу извлечь некоторую строку (а именно url) с помощью регулярного выражения из этих файлов.

Я попробовал это:

find . -path "*alder/ * / * .html" -print | xargs sed -n "/http:\/\/[^'\"]*/p" > urls.txt

... но это не работает так, как ожидалось. findЧасть работает нормально, xargsодна, нормально, а sedодна, нет. Все, что я получаю в urls.txt, это конкатенация всех файлов.

решение1

Используя ту же findкоманду, вы вернете URL-адреса, соответствующие регулярному выражению:

find . -path "*alder/ * / * .html"  -exec grep -oh "http://[^'\"]*" {} +

В отличие от find...-print | xargs command..., этот подход будет работать с файлами, имена которых содержат пробелы или другие сложные символы.

Параметр -oуказывает, grepчто нужно возвращать только совпадающую часть, а не строку, в которой находится совпадение. -hуказывает, что нужно пропустить печать имен файлов, в которых были найдены совпадения.

Команда findв OP находит только файлы, имена которых содержат пробелы в пути. Поскольку я подозреваю, что это не то, что вам нужно, вот альтернативная форма команды, findкоторая находит все .htmlфайлы на любой глубине в подкаталогах текущего каталога, имена которых заканчиваются на alder:

find *alder/ -name '*.html' -exec grep -oh "http://[^'\"]*" {} +

Более надежный подход

Чтобы защититься от других видов плохих htmlфайлов, cas предлагает разрешить пробел или >также сигнализировать о конце URL-адреса, а также httpsпринимать http:

find . -path "*alder/ * / * .html"  -exec grep -oEh "https?://[^'\"[:space:]>]*" {} +

решение2

Спасибо за все быстрые ответы. Извините за лишние пробелы в пути, но их удаление превращает путь во что-то странное при попытке разместить здесь.

Я хотел использовать sed, так как grep очень, очень медленный на 25 000 файлах размером более 1,2 ГБ.

Я нашел ответ. Первая команда sed для нарезки файлов с символами "'=, а затем вторая команда sed для печати строк. Вот она:

найти . -path "*alder.com/ * / * .html" -print| xargs sed -r "s/[\"'=]/\n/g"| sed -n "/^http\s?:/p" > urls.txt

Связанный контент