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?

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
,*,,*,

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'
,*,*,*,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.