Cykl wykonania sed s / REGEXP / REPLACEMENT / g


14

Dlaczego daje echo ,,, |sed s':\(,\)\(,\):\1*\2:'g,*,,” zamiast „ ,*,*,”? Innymi słowy: dlaczego pomimo flagi „g” sed nie wstawia „ *” między jedną parę przecinków?

Odpowiedzi:


14

Ponieważ z dwóch ,sw (,\)\(,\), już dopasowane dwa pierwsze ,s a wzór Regex dopasowane do tej pory nie będzie wracać do końca linii. Została tylko jedna, która jest ostatnia, ,dlatego właśnie została wydrukowana, ponieważ nie ma *między nią drugiej, ostatniej.

Jeśli masz inne ,dane wejściowe, otrzymasz pożądaną (globalną g) odpowiedź:

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,

O co chodzi z tym dziwnym cytatem? (Po co pozostawiać si gwychodzić ze znaków cudzysłowu?)
GnP

@GnP Haha, odziedziczony po OP.
heemayl

lubecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

Odpowiedź na pytanie została już udzielona przez @heemayl

Obejście problemu sed(przy założeniu GNU sed) - pętla rekurencyjnie, dopóki znalezione zostanie dopasowanie

$ echo ,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,

$ echo ,,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,*,

POSIXly:

$ echo ,,,, | sed -e :a -e 's/\(,\)\(,\)/\1*\2/; ta'
,*,*,*,

Lub z perl

$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.