Как сделать так, чтобы sed отображался первым, а не последним?

У вас слишком много )в первом шаблоне, и вам не хватает ifв замене:

:%s/if (\(.*\) != null)/if (StumpJunk.isSet(\1))/g   
1
05.09.2020, 16:52
5 ответов

Вы можете использовать awkвместо этого:

awk -F 'en-us">|</a>' '{print $2}'

Параметр -Fуказывает awkиспользовать либо en-us">, либо </a>в качестве разделителя полей вместо того, чтобы разделять строку по умолчанию.

И тогда остается только напечатать правильное поле. В данном случае это второе поле с print $2.

Это все при условии, что ваша тестовая строка не изменится.

0
18.03.2021, 23:07

Есть несколько способов борьбы с жадностью. Это можно сделать в 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
0
18.03.2021, 23:07

с использованием 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

ХТН.

https://raku.org/

0
18.03.2021, 23:07

команда 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
0
18.03.2021, 23:07

Я бы использовал для этого 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

и так далее.

0
18.03.2021, 23:07

Теги

Похожие вопросы