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?

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

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'
,*,*,*,
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.