Awk match () - несколько на строку - PullRequest
3 голосов
/ 05 мая 2011

Я использую функцию match () в gawk для извлечения ссылок из файла HTML ... регулярное выражение выглядит примерно так:

match($0, /(<a href=\")([^\"]+)/, arr)

Кажется, я не могу использовать опцию "/ g" в конце, чтобы получить несколько совпадений в строке?

Ответы [ 2 ]

5 голосов
/ 05 мая 2011

Это правильно. Регулярные выражения AWK не имеют флагов.
Также нет встроенной поддержки для match поиска второго или более поздних совпадений.
Только функции gsub и gensub имеют это.
Я бы попробовал что-то вроде этого:

gensub(/.*<a href=\"([^\"]+)/, "\1%", "g")
last = split($0, "%", arr)
delete arr[last]

где % - строка, которую вы можете гарантировать, что она не будет найдена во входных данных.

1 голос
/ 08 мая 2011

Lynx браузера в текстовом режиме может быть лучшим инструментом для сбора URL-адресов. Флаг -dump записывает форматированный вывод в стандартный вывод. В конце вы найдете нумерованный список всех видимых и скрытых ссылок на этой странице. (Или файл. Он принимает URL-адреса или имена файлов в качестве аргументов.)

$ lynx -dump http://www.stackoverflow.com 

[snip]
References

   Visible links
   1. http://stackoverflow.com/opensearch.xml
   2. http://stackoverflow.com/feeds
   3. http://stackexchange.com/
   4. http://stackoverflow.com/users/login
   5. http://careers.stackoverflow.com/
   6. http://chat.stackoverflow.com/
[snip]
 676. http://creativecommons.org/licenses/by-sa/3.0/
 677. http://blog.stackoverflow.com/2009/06/attribution-required/

   Hidden links:
 678. http://www.peer1.com/stackoverflow
 679. http://creativecommons.org/licenses/by-sa/3.0/
...