2011-06-26 12 views
5

Chcę przeczytać plik "teste", zrobić "znajdź & zamień" i nadpisać "teste" z wynikami. Im bliżej mam do dziś jest:Podstawianie tekstu (czytanie z pliku i zapisywanie do tego samego pliku) na Linuxzie z sed

$cat teste 
I have to find something 
This is hard to find... 
Find it wright now! 

$sed -n 's/find/replace/w teste1' teste 

$cat teste1 
I have to replace something 
This is hard to replace... 

Gdy próbuję zapisać do tego samego pliku w ten sposób:

$sed -n 's/find/replace/w teste' teste 

czyli

$sed -n 's/find/replace/' teste > teste 

wynik będzie pusty plik ...

Wiem, że brakuje mi czegoś bardzo głupiego, ale każda pomoc będzie mile widziana.


UPDATE: Na podstawie wskazówek podanych przez ludzi i tym linkiem: http://idolinux.blogspot.com/2008/08/sed-in-place-edit.html oto mój zaktualizowany kod:

sed -i -e 's/find/replace/g' teste 

Odpowiedz

17

W systemie Linux sed -i jest droga. sed nie jest jednak przeznaczony do edycji w miejscu; historycznie jest to filtr, program, który edytuje strumień danych w potoku, a do tego celu trzeba napisać do pliku tymczasowego, a następnie zmienić jego nazwę.

Powód pobrania pustego pliku polega na tym, że powłoka otwiera (i obcina) plik przed uruchomieniem polecenia.

+0

Dziękuję bardzo. Czy "ed" byłoby bardziej odpowiednie do edycji na miejscu zamiast "sed"? – Roger

+0

Tak i nie; 'ed' jest lepszy do edycji w miejscu, ale nie jest zbyt wygodny do użycia w skryptach, dlatego' sed' rozwinął niestandardową opcję (-i POSIX) '-i'. – geekosaur

+0

Tak więc w przypadku edycji i edycji w miejscu najlepszym w Linuksie jest "sed". Czy to prawda, że ​​tak jest? – Roger

1

Chcesz używać "sed -i". To aktualizacje na miejscu.

2

Chcecie: sed -i 's/foo/bar/g' file

1

W miejscu edycji z Perl

perl -pi -w -e 's/foo/bar/g;' file.txt 

lub

perl -pi -w -e 's/foo/bar/g;' files* 

dla wielu plików

0

Rozwiązanie ed jest:

ed teste <<END 
1,$s/find/replace/g 
w 
q 
END 

lub bez heredoc

printf "%s\n" '1,$s/find/replace/g' w q | ed teste 
Powiązane problemy