2013-01-21 17 views
6

Sto provando a scrivere un'espressione regolare per sostituire uno o più simboli '+' presenti in un file con uno spazio. Ho provato le seguenti:Sostituire un modello regex con awk

echo This++++this+++is+not++done | awk '{ sub(/\++/, " "); print }' 
This this+++is+not++done 

attesi:

This this is not done 

Tutte le idee perché questo non ha funzionato?

risposta

8

Usa gsub che fa la sostituzione globale:

echo This++++this+++is+not++done | awk '{gsub(/\++/," ");}1' 

sub funzione sostituisce solo prima partita, per sostituire tutte le partite utilizzano gsub.

+1

Grazie capito! –

2

È possibile utilizzare anche sed.

echo This++++this+++is+not++done | sed -e 's/+\{1,\}/ /g' 

Questo corrisponde a uno o più + e lo sostituisce con uno spazio.

5

o il comando tr:

echo This++++this+++is+not++done | tr -s '+' ' ' 
+0

'-s' è molto utile. Direi che questa è la soluzione migliore per semplicità. – alex

+0

Grazie! Trovo che 'tr' sia un comando sottovalutato. – radical7

+0

Questo è bello. – Suku

4

Prova questa

echo "This++++this+++is+not++done" | sed -re 's/(\+)+/ /g'

4

La soluzione awk idiomatica sarebbe solo tradurre il separatore di campo di ingresso al separatore di uscita:

$ echo This++++this+++is+not++done | awk -F'++' '{$1=$1}1' 
This this is not done 
-1
echo "This++++this+++is+not++done" | sed 's/++*/ /g' 
+0

Questo risponde all'attività indicata nella prima riga della domanda. –

0

Se si ha accesso al nodo sul computer si può fare installando rexreplace

npm install -g regreplace 

e quindi eseguire

rexreplace '\++' ' ' myfile.txt 

Di se si dispone di più file in una directory data si può fare

rexreplace '\++' ' ' data/*.txt 
+0

Se si confronta la dimensione di npm in awk e la velocità di sostituzione di tr rispetto a rexreplace, si potrebbe capire che questo utilizza una bomba per aprire un dado. –

+0

Non ha senso confrontare NPM con awk. Immagino tu intenda la dimensione di rexreplace. La velocità è sicuramente migliore con tr. La risposta cerca di offrire la comodità di utilizzare uno strumento in cui la sintassi è più facile da capire. Mi ricorda le discussioni durante l'introduzione di C, e la gente sosteneva che il codice generato era lento e disordinato rispetto a farlo in assemblaggio. – mathiasrw