Warum gibt echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
" ,*,,
" statt " ,*,*,
" nach? Mit anderen Worten: Warum fügt sed trotz der Markierung "g" kein "' *
' zwischen ein Komma ein?
Warum gibt echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
" ,*,,
" statt " ,*,*,
" nach? Mit anderen Worten: Warum fügt sed trotz der Markierung "g" kein "' *
' zwischen ein Komma ein?
Antworten:
Denn mit den beiden ,
s in (,\)\(,\)
, haben Sie bereits die ersten beiden abgestimmt ,
s und die RegexMuster bisher wird nicht denselben Weg zurückverfolgen , für den Rest der Linie abgestimmt. Jetzt ist nur noch eines übrig, das das letzte ist, ,
daher wird es so gedruckt, wie es ist, ohne dass es *
dazwischen das vorletzte ist.
Wenn Sie eine andere ,
Eingabe haben, erhalten Sie die gewünschte (globale g
) Antwort:
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
Das Warum der Frage wurde bereits von @heemayl beantwortet
Problemumgehung mit sed
(hier unter der Annahme von GNU sed
) - Schleife rekursiv, solange eine Übereinstimmung gefunden wird
$ 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'
,*,*,*,
Oder mit perl
$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,
$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
s
undg
aus den Anführungszeichen?)