Как написать функцию поиска для всех (с регулярным выражением) в awk или sed - PullRequest
2 голосов
/ 14 сентября 2010

У меня есть функция bash, которая запускает python (который возвращает все найденные регулярные выражения из stdin)

function find-all() {
    python -c "import re
import sys
print '\n'.join(re.findall('$1', sys.stdin.read()))"
}

Когда я использую это регулярное выражение find-all 'href="([^"]*)"' < index.html, оно должно вернуть первую группу из регулярного выражения (значение атрибута href из файла index.html)

Как мне написать это в sed или awk?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2010

Я предлагаю вам использовать grep -o.

-o, --only-matching
       Show only the part of a matching line that matches PATTERN.

например:.

$ cat > foo
test test test
test
bar
baz test
$ grep -o test foo
test
test
test
test
test

Обновление

Если вы извлекали атрибуты href из html-файлов, используя команду типа:

$ grep -o -E 'href="([^"]*)"' /usr/share/vlc/http/index.html
href="style.css"
href="iehacks.css"
href="old/"

Вы могли бы извлечь значения, используя cut и sed, например:

$ grep -o -E 'href="([^"]*)"' /usr/share/vlc/http/index.html| cut -f2 -d'=' | sed -e 's/"//g'
style.css
iehacks.css
old/

Но вам лучше использовать html / xml парсеры для надежности.

2 голосов
/ 17 сентября 2010

Вот реализация gawk (не тестировалась с другими awk): find_all.sh

awk -v "patt=$1" '
    function find_all(str, patt) {
        while (match(str, patt, a) > 0) {
            for (i=0; i in a; i++) print a[i]
            str = substr(str, RSTART+RLENGTH)
        }
    }
    $0 ~ patt {find_all($0, patt)}
' -

Тогда:

echo 'asdf href="href1" asdf asdf href="href2" asdfasdf
asdfasdfasdfasdf href="href3" asdfasdfasdf' | 
find_all.sh 'href="([^"]+)"' 

выходы:

href="href1"
href1
href="href2"
href2
href="href3"
href3

Измените i=0 на i=1, если вы хотите распечатать только захваченные группы. С i=0 вы получите вывод, даже если в вашем шаблоне нет скобок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...