Ciclo de execução de s / s / REGEXP / REPLACEMENT / g

14

Por que echo ,,, |sed s':\(,\)\(,\):*:'g produz " ,*,, " em vez de " ,*,*, "? Em outras palavras: por que, apesar do sinalizador "g", o sed não insere ' * ' entre um par de vírgulas?

    
por user3143179 06.09.2016 / 23:05

2 respostas

14

Como os dois , s em (,\)\(,\) , você já correspondeu aos dois primeiros , s e o padrão Regex correspondido até agora não voltará atrás para o resto da linha. Apenas um é deixado agora que é o último , , portanto ele é impresso como está sem qualquer * entre o segundo último.

Se você tiver outro , na entrada, você obterá a resposta desejada (global, g ):

% echo ,,,, | sed s':\(,\)\(,\):*:'g
,*,,*,
    
por 06.09.2016 / 23:15
8

O motivo da pergunta já foi respondido por @heemayl

Solução alternativa com sed (assumindo aqui o GNU sed ) - faça um loop recursivamente contanto que uma correspondência seja encontrada

$ echo ,,, | sed -E ':a s/(,)(,)/*/ ; ta'
,*,*,

$ echo ,,,, | sed -E ':a s/(,)(,)/*/ ; ta'
,*,*,*,

POSIXly:

$ echo ,,,, | sed -e :a -e 's/\(,\)\(,\)/*/; ta'
,*,*,*,

Ou com perl

$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
    
por 07.09.2016 / 04:33