Ciclo di esecuzione di sed s / REGEXP / SOSTITUZIONE / g


14

Perché echo ,,, |sed s':\(,\)\(,\):\1*\2:'g" ,*,," anziché " " produce ,*,*,? In altre parole: perché, nonostante la bandiera "g", sed non inserisce ' *' tra una coppia di virgole?

Risposte:


14

Perché con le due ,s in (,\)\(,\), hai già abbinato le prime due ,s e il modello Regex abbinato finora non tornerà indietro per il resto della linea. Ne rimane solo uno ora che è l'ultimo, ,quindi è appena stampato come è senza alcun mezzo *tra di esso il secondo ultimo.

Se ne hai un altro ,in input, otterrai la grisposta desiderata (globale, ):

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,

Cosa c'è con la strana citazione? (Perché uscire se guscire dalle virgolette?)
GnP

@GnP Haha, ereditato dall'OP.
heemayl

oppureecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

Il perché della domanda ha già risposto a @heemayl

Soluzione con sed(qui assumendo GNU sed) - loop ricorsivamente finché viene trovata una corrispondenza

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

O con perl

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

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.