У меня много файлов в структуре каталогов. Я хочу извлечь некоторую строку (а именно 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