Я хотел бы, чтобы bash анализировал / извлекал полный URL (и только URL) из случайной короткой строки.
Примеры:
bob, the address is http://www.google.com
или
https://foo.com/category/example.html is up
или
Error 123 occurred at http://bit.ly/~1223456677878
или
Stats are up: https://foo1234.net/report.jpg
Я пытался использовать, cat foo_output | egrep -o "https?://[\w'-\.]*\s"
но это не сработало.
bash
scripting
regular-expression
Майк Б
источник
источник
Ответы:
Ты пробовал:
вместо?
Обратите внимание, что все, что связано с классом символов, воспринимается как литерал, поэтому выражение
[\w]
не соответствует символу слова . Более того, вам не нужно избегать метасимволов регулярных выражений в классе символов, т. Е. Говорить[\.]
не совсем то же самое, что и[.]
.источник
[^ ]
слишком широк, вы хотите , чтобы исключить другие пробелы,(
,)
, возможно , запятые, и все символы, которые не разрешены в URL.URI не подходят для сопоставления регулярных выражений, когда они встроены в естественный язык. Тем не менее, текущее состояние - это « Улучшенный либерал» Джона Грубера « Шаблон точного регулярного выражения для сопоставления URL-адресов» . В настоящее время размещена однострочная версия:
Джон также, кажется, поддерживает суть здесь , хотя его запись в блоге намного лучше объясняет его тестовый корпус и ограничения шаблона регулярного выражения.
Если вы хотите реализовать выражение из командной строки, вы можете оказаться ограничены используемым механизмом регулярных выражений или проблемами с цитированием оболочки. Я нашел Ruby-скрипт как лучший вариант, но ваш пробег может отличаться.
источник
Проблема с сопоставлением URL-адресов заключается в том, что в URL-адресе может быть что угодно :
Как вы можете видеть, (действительный) URL выше , содержит
$
,?
,#
,&
,,
,.
и:
. По сути, единственное, что вы можете быть уверены, что URL-адрес не содержит, это пустое пространство. Имея это в виду, вы можете извлечь ваши URL с помощью простого шаблона:\S
Соответствует любым некосмическим символам в Perl совместимых регулярных выражений (PCREs), то-P
активируется PCREs дляgrep
и-o
делает печать только совпадающий отрезок линии.источник
Я бы пошел на цепочку, но немного по-другому. Если у вас есть текстовый фрагмент, подобный вашему, в текстовом файле strings.txt, вы можете сделать следующее:
Объяснение:
Поскольку существует вероятность того, что URL-адрес может не работать, вы можете выполнить дополнительную проверку ошибок с вашим URL-адресом. Например,
wget -p URL -O /dev/null
- он напечатает совершенно другие коды ошибок, если URL-адрес недоступен, так что вы можете настроить цикл для обработки списка ссылок и вывода их статуса достоверности.Если вы в конечном итоге извлекаете ссылки из HTML-файлов,
sed
в особых случаях могут возникнуть проблемы . Как было предложено в забавном посте, который вы, вероятно, уже видели - может быть, лучше не использовать регулярные выражения, а механизм парсера html. Одним из таких легко доступных парсеров является только текстовый браузерlynx
(доступный на любом Linux). Это позволяет мгновенно вывести список всех ссылок в файле, а затем просто извлечь нужные URL-адреса с помощью grep.Однако это не будет работать с большинством искаженных HTML-файлов или текстовых фрагментов со ссылками.
источник
Просто
egrep -o 'https?://[^ ")]+'
который будет включать
url()
и "http"источник
egrep
не рекомендуется.альтернативно добавьте команду SED, чтобы сохранить ее в файле CSV:
источник