У меня есть функция 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?
Я предлагаю вам использовать 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 для надежности.
grep -o -E 'href="([^"]*)"'
это возвращает всю совпадающую строку, а не первую группу (из скобок).
Здесь реализация gawk (не протестирована с другими awks): 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
вы получите выход, даже если в вашем шаблоне нет скобок.