Chciałbym edytować plik za pomocą seda na OS X. Używam następującego polecenia:
sed 's/oldword/newword/' file.txt
Wyjście jest wysyłane do terminala. plik.txt nie jest modyfikowany. Zmiany są zapisywane w pliku file2.txt za pomocą tego polecenia:
sed 's/oldword/newword/' file1.txt > file2.txt
Jednak nie chcę innego pliku. Chcę tylko edytować plik1.txt . W jaki sposób mogę to zrobić?
Wypróbowałem flagę -i. Powoduje to następujący błąd:
sed: 1: "file1.txt": invalid command code f
-i
flagi?Odpowiedzi:
Możesz użyć
-i
flagi poprawnie, podając sufiks, który zostanie dodany do pliku kopii zapasowej. Rozszerzając twój przykład:Otrzymasz dwa pliki: jeden z nazwą
file1.txt
zawierającą podstawienie i jeden z nazwąfile1.txt.bu
zawierającą oryginalną zawartość.Lekko niebezpieczne
Jeśli chcesz destrukcyjnie nadpisać oryginalny plik, użyj czegoś takiego:
Ze względu na sposób analizowania wiersza wymagana jest spacja między flagą opcji a jej argumentem, ponieważ argument ma zerową długość.
Poza ewentualnym zniszczeniem oryginału, nie jestem świadomy dalszych niebezpieczeństw związanych z oszukaniem seda w ten sposób. Należy jednak zauważyć, że jeśli to wywołanie programu
sed
jest częścią skryptu, system Unix Way ™ (IMHO) powinien użyć funkcjised
nieniszczącej, przetestować, czy zakończył się poprawnie, a dopiero potem usunąć zbędny plik.źródło
-i''
niebezpieczny z jakiegokolwiek innego powodu niż potencjalne zepsucie oryginalnego pliku (i brak kopii zapasowej)?sed
stroną podręcznika, jeśli zabraknie miejsca na dysku w urządzeniu, możesz uszkodzić plik w trakcie kroku i uzyskać zły wynik wyjściowy. Jeśli pracujesz pod kontrolą lokalnego źródłased -i ""
bez kopii zapasowych, powinno być dobrze przez większość czasu (lub tużgit init && git add -A . && git commit -m 'backup'
przed uruchomieniem seda w-i
trybie).-i''
jest ważny, ale-i ''
nie jest.Mam podobny problem z MacOS
nie działa, ale
działa dobrze.
źródło
sed -i '' <file>
działa, alesed -i'' <file>
już nie działaźródło
Możesz użyć
-i''
(--in-place
)sed
jak już sugerowano. Zobacz: Argument-i
w miejscu , zwróć jednak uwagę, że-i
opcja jest niestandardowym rozszerzeniem FreeBSD i może nie być dostępna w innych systemach operacyjnych. Po drugiesed
jest to itor S tream ED , a nie edytor plików .Alternatywnym sposobem jest użycie wbudowanego podstawiania w trybie Vim Ex, na przykład:
a dla wielu plików:
Aby edytować wszystkie pliki rekurencyjnie, możesz użyć
**/*.*
jeśli powłoka to obsługuje (włącz przezshopt -s globstar
).Innym sposobem jest użycie
gawk
i jego nowego rozszerzenia „inplace”, takiego jak:źródło
Tworzy to pliki kopii zapasowych. Np.
sed -i -e 's/hello/hello world/' testfile
Dla mnie tworzy plik kopii zapasowej, testfile-e, w tym samym katalogu.źródło
Możesz użyć:
Przykład:
Działa to bezbłędnie na komputerach Mac .
źródło
-i
wymaga argumentu dla macOS. Ponieważ nie określisz żadnego, używa-e
, co skutkuje posiadaniem drugiego pliku z-e
dołączonym.-e
nie istnieje w macOS, tak jest-E
. Tak więc poprawne polecenie dla macOS tosed -i '' -E 's/Hello/Bye/' file.txt