Я бы пошел на цепочку, но немного по-другому. Если у вас есть текстовый фрагмент, подобный вашему, в текстовом файле strings.txt, вы можете сделать следующее:
grep http ./strings.txt | sed 's/http/\nhttp/g' | grep ^http | sed 's/\(^http[^ <]*\)\(.*\)/\1/g' | grep IWANTthis | sort -u
Объяснение:
grep http ./st3.txt => will catch lines with http from text file
sed 's/http/\nhttp/g' => will insert newline before each http
grep ^http => will take only lines starting with http
sed 's/\(^http[^ <]*\)\(.*\)/\1/g'
=> will preserve string from ^http until first space or < (the latter in hope if
grep IWANTthis => will take only urls containing your text of your interest; you can omit this.
sort -u => will sort the list and remove duplicates from it
Поскольку существует вероятность того, что URL-адрес может не работать, вы можете выполнить дополнительную проверку ошибок с вашим URL-адресом. Например, wget -p URL -O /dev/null
- он напечатает совершенно другие коды ошибок, если URL-адрес недоступен, так что вы можете настроить цикл для обработки списка ссылок и вывода их статуса достоверности.
Если вы в конечном итоге извлекаете ссылки из HTML-файлов, sed
в особых случаях могут возникнуть проблемы . Как было предложено в забавном посте, который вы, вероятно, уже видели - может быть, лучше не использовать регулярные выражения, а механизм парсера html. Одним из таких легко доступных парсеров является только текстовый браузер lynx
(доступный на любом Linux). Это позволяет мгновенно вывести список всех ссылок в файле, а затем просто извлечь нужные URL-адреса с помощью grep.
lynx -dump -listonly myhtmlfile.html | grep IWANTthisString | sort -u
Однако это не будет работать с большинством искаженных HTML-файлов или текстовых фрагментов со ссылками.