2010-10-20 16 views
20

Mam skrypt, który wywołuje polecenie grep, aby przetworzyć plik tekstowy. Obecnie robię coś takiego.Lokalne przetwarzanie za pomocą polecenia grep

$ grep 'SomeRegEx' myfile.txt > myfile.txt.temp 
$ mv myfile.txt.temp myfile.txt 

Zastanawiam się, czy istnieje jakikolwiek sposób zrobić przetwarzanie w miejscu, jak w sklepie wyniki do tego samego oryginalnego pliku bez konieczności tworzenia pliku tymczasowego, a następnie zastąpić oryginał pliku temp kiedy przetwarzanie jest zakończone.

Oczywiście z radością przyjmuję komentarze, dlaczego tak się powinno lub nie powinno być, ale przede wszystkim interesuje mnie, czy to można zrobić. W tym przykładzie używam grep, ale ogólnie interesują mnie narzędzia Unix. Dzięki!

Odpowiedz

12

Perl posiada przełącznik -i, więc nie sed i Ruby

sed -i.bak -n '/SomeRegex/p' file 

ruby -i.bak -ne 'print if /SomeRegex/' file 

Ale pamiętaj, że wszystko, co kiedykolwiek robi, to tworzenie plików "tymczasowych" z tyłu, które uważasz, że nie widzisz, to wszystko.

Inne sposoby, oprócz grep

awk

awk '/someRegex/' file > t && mv t file 

bash

while read -r line;do case "$line" in *someregex*) echo "$line";;esac;done <file > t && mv t file 
+0

Jak przykłady awk i bash poprawić na oryginalnym grep, inny niż '' && zamiast ' ; '? Wciąż jawnie tworzą tymczasowy plik. –

2

Nie, na ogół nie można tego zrobić w systemie Unix. Możesz tylko tworzyć/skracać (z>) lub dołączać do pliku (za pomocą >>). Po obcięciu stara zawartość zostanie utracona.

3

Zasadniczo nie można tego zrobić. Ale Perl posiada przełącznik -i:

perl -i -ne 'print if /SomeRegEx/' myfile.txt 

Pisanie -i.bak spowoduje oryginalna być zapisane w myfile.txt.bak.

(Oczywiście wewnętrznie, Perl po prostu robi to, co w zasadzie jesteś już robi. - nie ma specjalnej magii zaangażowany)

+2

dostał natomiast szukałem go - +1 do szybkości –

0

Większość instalacji sed może przeprowadzić edycję w miejscu, sprawdź stronę podręcznika, prawdopodobnie chcesz mieć flagę -i.

0

Aby edytować plik w miejscu za pomocą vim-drożny, spróbuj:

$ ex -s +'%!grep foo' -cxa myfile.txt 

Alternatywnie można użyć sed lub gawk.

11

sponge (w pakiecie moreutils w systemie Debian/Ubuntu) odczytuje dane wejściowe do EOF i zapisuje je do pliku, dzięki czemu można pobrać plik grep i zapisać go ponownie.

Jak to:

grep 'pattern' file | sponge file 
Powiązane problemy