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?
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:
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
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
@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'
,*,*,*,
setghors des guillemets?)