Por que echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
produz " ,*,,
" ao invés de " ,*,*,
"? Em outras palavras: por que, apesar da bandeira "g", o sed não insere ' *
' entre um par de vírgulas?
Por que echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
produz " ,*,,
" ao invés de " ,*,*,
"? Em outras palavras: por que, apesar da bandeira "g", o sed não insere ' *
' entre um par de vírgulas?
Respostas:
Como com os dois ,
s dentro (,\)\(,\)
, você já correspondeu aos dois primeiros se ,
o padrão Regex correspondente até agora não retornará ao restante da linha. Só resta um agora, que é o último, ,
portanto, apenas é impresso como está, sem nenhum *
entre ele, o segundo último.
Se você tiver outra ,
entrada, obterá a g
resposta (global ) desejada :
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
O porquê da pergunta já foi respondido por @heemayl
Solução alternativa com sed
(aqui assumindo GNU sed
) - faça um loop recursivamente desde que seja encontrada uma correspondência
$ 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'
,*,*,*,
Ou com perl
$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,
$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
s
eg
fora das aspas?)