Cycle d'exécution de sed s / REGEXP / REPLACEMENT / g

14

Pourquoi echo ,,, |sed s':\(,\)\(,\):\1*\2:'gcède " ,*,," plutôt que " ,*,*,"? En d'autres termes: pourquoi, malgré le drapeau "g", sed n'insère-t-il pas ' *' entre une paire de virgules?

user3143179
la source

Réponses:

14

Parce qu'avec les deux ,s (,\)\(,\), vous avez déjà fait correspondre les deux premiers ,s et le motif Regex correspondant jusqu'à présent ne fera pas marche arrière pour le reste de la ligne. Il ne reste plus qu'un seul qui soit le dernier, ,donc il vient d'être imprimé tel qu'il est sans aucun *entre-deux l'avant-dernier.

Si vous en avez un autre ,en entrée, vous obtiendrez la gréponse souhaitée (globale ):

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
heemayl
la source
Quelle est la citation bizarre? (Pourquoi laisser set ghors des guillemets?)
GnP
@GnP Haha, hérité de l'OP.
heemayl
ouecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot
8

@Heemayl a déjà répondu au pourquoi de la question

Solution de contournement avec sed(en supposant ici GNU sed) - boucle récursivement tant qu'une correspondance est trouvée

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

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

POSIX:

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

Ou avec perl

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

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