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

14

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?

user3143179
fonte

Respostas:

14

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
,*,,*,
heemail
fonte
O que há com a citação estranha? (Por que deixar se gfora das aspas?)
PNB
@ GNP Haha, isso é herdado do OP.
heemayl 6/09/16
ouecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot 7/09/16
8

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'
,*,*,*,
Sundeep
fonte