2012-02-29 20 views
6

Im próbuje zrobić podstawienie jednej linii w pliku z awk, na przykładzmienić linię z awk

zmieniając w ten sposób:

e1 is (on) 

e2 is (off) 

do:

e1 is (on) 

e2 is (on) 

użytku polecenie:

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

this dokonuje zmiany, ale plik kończy się pusty!

Odpowiedz

18

Inna odpowiedź za pomocą innego narzędzia (SED, a -I (na miejscu) Flag)

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

Twój awk jest poprawny, jednak przekierowujesz do tego samego pliku co oryginał. Powoduje to zastąpienie oryginalnego pliku przed jego odczytaniem. Musisz przekierować dane wyjściowe do innego pliku.

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

Zmień nazwę Prueba.new później, jeśli to konieczne.

+2

+1. Nacisk na "oryginalny plik [jest] nadpisany * przed * został przeczytany" –

0

Nie można przekierować do tego samego pliku co plik wejściowy. Wybierz inną nazwę pliku.

The > będzie opróżnić złożyć na pierwszym miejscu.

2

Jak wyjaśniono przez innych odpowiedzi i na pytanie „Why reading and writing the same file through I/O redirection results in an empty file in Unix?”, to przekierowania powłoki zniszczyć swój plik wejściowy przed jej czytać.

Aby rozwiązać ten problem, nie odwołując się bezpośrednio do plików tymczasowych, należy przejrzeć komendę sponge z kolekcji .

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

Ewentualnie, jeśli GNU awk jest zainstalowany w systemie, można użyć in place extension.

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