Zauważ, że strona podręcznika jest niepoprawna. sednie wykonuje edycji na miejscu. Tworzy nowy plik i zastępuje stary, zmienia się i-węzeł.
Marco
2
@Marco To bezpieczny sposób edycji pliku na miejscu. „Edycja pliku na miejscu” w dokumentacji sed oznacza, że oryginalny plik (zgodnie z jego nazwą) jest modyfikowany, a nie, że oryginalny plik (zgodnie z definicją jego i-węzła) jest modyfikowany.
Gilles „SO- przestań być zły”
2
@Gilles Całkowicie się zgadzam, że jest to preferowany sposób edycji pliku, ale raczej nie nazwałbym tego w miejscu . Ale sprowadza się to do pytania, w jaki sposób plik jest identyfikowany, według i-węzła lub nazwy. Powiedziałbym, że przez i-węzeł, w przeciwnym razie konstrukty takie { rm file; cmd > file; } < filedoprowadziłyby do wniosku, że cmd czyta i zapisuje do tego samego pliku, czego nie robi. To dwa odrębne pliki, które akurat mają taką samą nazwę. Ale nie chcę tutaj rozmawiać.
Marco
Na MacOS 10.14 dostaję, sed: 1: "foo.txt": invalid command code fgdy jestem uruchomiony sed -i 's/o/X/g' foo.txt. Jednak zapewnienie rozszerzenia, podobnie jak sed -i .bak 's/o/X/g' foo.txtdziała dobrze. Wszelkie pomysły, jak to zrobić bez tworzenia plików kopii zapasowych?
Joshua Pinter
1
Okej, wymyśliłem to. W systemie macOS należy jawnie dodać pusty ciąg dla opcji parametru rozszerzenia:sed -i '' 's/o/X/g' foo.txt
-e
Flaga oznacza wyrażenie. Prawdopodobnie chcesz-i
flagi, co oznaczain-place
i zdecydowanie zalecamy jej użyciesed -i.bak 's/../' filename
Odpowiedzi:
Myślę, że szukasz
-i
:Na przykład:
Jeśli podasz sufiks, utworzy plik kopii zapasowej:
Plik wejściowy jest modyfikowany i tworzona jest kopia zapasowa zawierająca oryginalne dane pliku.
Zauważ też, że dotyczy to GNU
sed
, istnieją niewielkie różnice w formacie między różnymised
implementacjami.źródło
sed
nie wykonuje edycji na miejscu. Tworzy nowy plik i zastępuje stary, zmienia się i-węzeł.{ rm file; cmd > file; } < file
doprowadziłyby do wniosku, że cmd czyta i zapisuje do tego samego pliku, czego nie robi. To dwa odrębne pliki, które akurat mają taką samą nazwę. Ale nie chcę tutaj rozmawiać.sed: 1: "foo.txt": invalid command code f
gdy jestem uruchomionysed -i 's/o/X/g' foo.txt
. Jednak zapewnienie rozszerzenia, podobnie jaksed -i .bak 's/o/X/g' foo.txt
działa dobrze. Wszelkie pomysły, jak to zrobić bez tworzenia plików kopii zapasowych?sed -i '' 's/o/X/g' foo.txt
To rozwiązanie działa w przypadku HPUX (UNIX):
1
{ rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh
.:2)
perl -pi -e 's/Error/NO_Error/g' test1.sh
3)
sed 's/Error/NO_Error/g' test1.sh | tee test1.sh
źródło
-e
opcja służy do wykonywania wielused
poleceńuznać
file.txt
zawtedy O / P jest
-i
opcja zapisuje zmiany na stałe ...źródło