У вас слишком много )
в первом шаблоне, и вам не хватает if
в замене:
:%s/if (\(.*\) != null)/if (StumpJunk.isSet(\1))/g
Вы можете использовать awk
вместо этого:
awk -F 'en-us">|</a>' '{print $2}'
Параметр -F
указывает awk
использовать либо en-us">
, либо </a>
в качестве разделителя полей вместо того, чтобы разделять строку по умолчанию.
И тогда остается только напечатать правильное поле. В данном случае это второе поле с print $2
.
Это все при условии, что ваша тестовая строка не изменится.
Есть несколько способов борьбы с жадностью. Это можно сделать в 2 шага. Первый — удалить все, что идет после первого совпадения, а второй — удалить все, что идет до совпадения
sed -r 's/([0-9]+\.[0-9][^<]*).*/\1/; s/.*>(.*)$/\1/' file
Следующий способ является универсальным. Позволяет сделать выбор любого шаблона в строке
sed -r 's/(>[0-9]+\.[0-9][^<]*)/\1\r/8; s/.*>(.*)\r.*/\1/' file
173.14.39
Ставим флаг \r
в конце шаблонов по указанному номеру в команде подстановки, далее делаем выборку на основе флага. В примерах используются шаблоны 1 и 2. Поэкспериментируйте с числами
sed -r 's/(>[0-9]+\.[0-9][^<]*)/\1\r/2; s/.*>(.*)\r.*/\1/' file
435.21
sed -r 's/(>[0-9]+\.[0-9][^<]*)/\1\r/1; s/.*>(.*)\r.*/\1/' file
450.66
с использованием Raku (ранее известного как Perl _6):
Приведенный ниже код является хорошей отправной точкой -для начала использования Раку. Как только вы получите правильное регулярное выражение, вы можете немного изменить код, чтобы получить точный результат, который вы хотите:
~$ raku -ne 'm:g/ (\d+ \. \d+) /.put ;'
ИЛИ
~$ raku -ne 'm:g/ (<digit>+ \. <digit>+) /.put ;'
ИЛИ
~$ raku -ne 'm:g/ (<digit>+ \. <digit>+) /; put $/ ;'
Выход (во всех 3 случаях):
450.66 435.21 390.138 340.108 304.137 71.86 71.86 71.86 96.43 96.43 96.43 173.14 173.14
Выше вы в основном просите Раку проверить вашу строку ввода -по -строке(-ne
Флаг ), найти все совпадения, т.е. «сопоставить :глобальное»(m:g
)с (<digit>+ \. <digit>+)
регулярное выражение. Круглые скобки вокруг (<digit>+ \. <digit>+)
указывают на степень вашего захвата (, то есть на весь матч ). Каждое совпадение во входной строке сохраняется как $0
, $1
, $2
и т. д. в переменной match $/
.
Вот именно. Поскольку вам нужно первое совпадение, все, что вам нужно сделать, это вытащить $0
, и я считаю, что проще всего написать этот код так:
~$ raku -ne 'put $0 if m:g/ (<digit>+ \. <digit>+) /;'
ИЛИ это:
~$ raku -ne 'm:g/ (<digit>+ \. <digit>+) /; put $0;'
Выход (в обоих случаях):
450.66
ХТН.
команда awk
awk -F "en-us" '{gsub(/<.*/,"",$2);print $2 }' l| awk '{gsub(/^">/,"",$0);print }'
Питон
#!/usr/bin/python
import re
o=re.compile(r'<.*')
k=open('l','r')
for i in k:
j=i.split("en-us")[1]
print re.sub(o,"",j).replace('">','')
выход
450.66
Я бы использовал для этого awk вместо sed, т.е. с GNU awk для мульти -char RS для печати номера 1-й версии:
$ awk -v RS='</a>' -F'>' '{print $NF; exit}' file
450.66
для печати третьего:
$ awk -v RS='</a>' -F'>' 'NR==3{print $NF; exit}' file
390.138
или 6-й:
$ awk -v RS='</a>' -F'>' 'NR==6{print $NF; exit}' file
71.86.15
или связанный с серией 304.xx:
$ awk -v RS='</a>' -F'>' '/304.xx series/{print $NF; exit}' file
304.137
и так далее.