2011-07-31 20 views
7

Zrobiłem trochę hands-on z poleceniem Unix sed. Próbowałem zastąpić polecenie i dołączyć do pliku. Ale trudność polega na tym, że muszę utworzyć plik pośredni, a następnie wykonać mv, aby zmienić jego nazwę na oryginalny plik.Jak zastąpić bez tworzenia pliku pośredniego w sed?

Czy jest jakiś sposób, aby zrobić to za jednym razem w tym samym pliku?

[[email protected] practice]# sed '1i\ 
> Today is Sunday 
> ' file1 > file1 

[[email protected] practice]# cat file1 
[[email protected] practice]# 

Plik został usunięty!

[[email protected] practice]# sed 's/director/painter/' file1 > file1 
[[email protected] practice]# cat file1 

Plik został usunięty!

+1

Ktoś, kto zagłosował na moje pytanie? Ale dlaczego? – kingsmasher1

Odpowiedz

11

GNU sed zna opcję -i, która wykonuje w miejscu edycji podanych plików.

Podczas operacji file1 > file1 co faktycznie się dzieje, że plik jest otwieranyi obcinane przez powłokę przed program (który dostaje jego nazwę jako argument) przychodzi czytać niczego od niego.

Aktualizacja:

sed na stronie mężczyzna stwierdza co następuje opcję -i (dzięki Delan o tym wspomnieć):

-i[SUFFIX], --in-place[=SUFFIX] 

      edit files in place (makes backup if extension supplied) 
+0

Naprawdę? Masz na myśli użycie opcji -i, która może zastąpić i dołączyć do tego samego pliku? Pozwól mi wypróbować. – kingsmasher1

+2

Należy unikać skrótów do innych argumentów opcji po '-i'. Często używam 'sed -i -r' do tworzenia sedów na miejscu z ERE, ale nie mogę używać' sed -ir', ponieważ tworzyłoby to kopię zapasową, dodając 'r' do plików kopii zapasowych. –

+0

* w miejscu * jak w, edytuj linie, które pasują, pozostawiając innych w spokoju. * NIE * dołącz. –

1

sed -i.bak „s/reżyser/malarz/"file1

-i[SUFFIX], --in-place[=SUFFIX] 

    edit files in place (makes backup if extension supplied) 
+0

Dziękuję, tak, próbowałem to działało. Ale wyjście konsoli jest stłumione. Awansuj na ciebie i Fritschy :) – kingsmasher1

11

Spróbuj tego -

sed -i '' 's/originaltext/replacementtext/g' filename | cat filename 

-i "" służy do udostępniania pliku kopii zapasowej. Jeśli masz pewność, że twój zamiennik nie spowoduje problemu, który możesz umieścić "nie przesyłaj żadnego pliku kopii zapasowej"

/g służy do wymiany globalnej. Jeśli masz więcej niż jeden tekst oryginalny w jednym wierszu, to opcja/g zastąpi wszystko inne, a zastąpi tylko pierwszy.

+0

Używanie 'sed -i''' bez miejsca dla mnie działało na gitbash – cjsimon

+0

' sed -i '' '(z spacją) będzie działało z BSD sed, ale tylko' sed -i ' "(brak miejsca) będzie działać z GNU sed. Dość frustrujące. –

Powiązane problemy