Pourquoi echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
cè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:'g
cè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 g
ré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'
,*,*,*,
s
etg
hors des guillemets?)