Я б пішов на прикування, але трохи інакше. Якщо у текстовому файлі під назвою 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-файлів або текстових фрагментів із посиланнями.