Por que echo ,,, |sed s':\(,\)\(,\):\1*\2:'gproduz " ,*,," 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:'gproduz " ,*,," 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 gresposta (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'
,*,*,*,
segfora das aspas?)