Ausführungszyklus von sed s / REGEXP / REPLACEMENT / g


14

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:


14

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
,*,,*,

Was ist mit dem seltsamen Zitat? (Warum verlassen sund gaus den Anführungszeichen?)
GnP

@GnP Haha, das ist vom OP geerbt.
Heemayl

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

8

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'
,*,*,*,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.