2012-02-29 14 views
6

Im cercando di fare una sostituzione di una singola riga in un file con awk, per esempiocambiare una linea con awk

cambiare questo:

e1 is (on) 

e2 is (off) 

a:

e1 is (on) 

e2 is (on) 

uso comando:

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba 

questo fa la sostituzione ma il file finisce in bianco!

risposta

18

Un'altra risposta, utilizzando uno strumento diverso (sed, e il -i (sul posto) flag)

sed -i '/e2/ s/off/on/' ~/Documents/Prueba 
17

Il tuo awk è corretto, tuttavia stai reindirizzando allo stesso file dell'originale. Ciò sta causando la sovrascrittura del file originale prima che sia stato letto. Dovrai reindirizzare l'output su un altro file.

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba.new 

Rinominare Prueba.new in seguito se necessario.

+2

+1. Enfasi su "il file originale [è] sovrascritto * prima * è stato letto" –

0

Non è possibile reindirizzare allo stesso file del file di input. Scegli un altro nome di file.

Il > svuoterà il file al primo posto.

2

È inoltre possibile utilizzare cat di leggere il file prima, quindi utilizzare pipe per reindirizzare stdout, poi letto con awk dallo standard input:

cat ~/Documents/Prueba | awk '/e2/{gsub(/off/, "on")};{print}' - > ~/Documents/Prueba 

credo che il cruscotto - è opzionale, dal momento che si sta solo leggendo stdin.

Alcuni documentazione interessante: https://www.gnu.org/software/gawk/manual/html_node/Naming-Standard-Input.html

2

Come spiegato dalle altre risposte e nella domanda "Why reading and writing the same file through I/O redirection results in an empty file in Unix?", le redirezioni della shell distruggere il vostro file di input prima che venga letta.

Per risolvere il problema senza ricorrere esplicitamente a file temporanei, consultare il comando sponge della raccolta moreutils.

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba | sponge ~/Documents/Prueba 

In alternativa, se GNU awk è installato sul sistema, è possibile utilizzare il in place extension.

gawk -i inplace '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba 
Problemi correlati