sed
Edycja na miejscu
Szukaj…
Składnia
- sed-I rozszerzenie - FreeBSD sed (ciągły licznik linii)
- sed -I [ rozszerzenie ] - NetBSD i Illumos sed (ciągły licznik linii)
- rozszerzenie sed -i - FreeBSD sed
- sed -i [ rozszerzenie ] - NetBSD, OpenBSD, Illumos, BusyBox i GNU sed
- sed --in-place [= rozszerzenie ] - Illumos, BusyBox i GNU sed
Parametry
Parametr | Detale |
---|---|
extension | Zapisz plik kopii zapasowej z określonym rozszerzeniem lub brak pliku kopii zapasowej, gdy extension jest łańcuchem zerowym. |
Uwagi
Edycja na miejscu jest powszechnym, ale niestandardowym rozszerzeniem występującym w większości najnowszych systemów.
(sekcja taka jak ta pojawia się we wszystkich aktualnych instrukcjach BSD sed
i ich pochodnych)
Nie zaleca się podawania rozszerzenia o zerowej długości podczas edycji plików, ponieważ grozi to uszkodzeniem lub częściową zawartością w sytuacjach, gdy miejsce na dysku jest wyczerpane itp.
Nie zapomnij o potężnym ed
Jest zdecydowanie za używanie sed
i w miejscu edycji cechy sed
, ale gdy średnia UNIX zostanie przedłużony, należy zawsze zapytać, dlaczego stara norma UNIX nie obejmują tej funkcji. Chociaż system UNIX nie jest doskonały, ortogonalność i kompletność narzędzi została opracowana tak, aby była niemal idealna, przynajmniej do celów, które były widoczne około 1970 roku: edycja tekstu i automatyczna edycja tekstu były z pewnością widoczne w tym czasie.
W rzeczywistości sed
nie jest edycja pliku na miejscu, ale edycja strumienia . Dlatego nazwa sed
jest krótką formą edytora strumieniowego . Zabierz s
, a otrzymasz narzędzie, które zostało zaprojektowane do edycji plików : ed
:
printf 'g/what to replace/s//with what to replace/g\nw\nq\n' | ed file
lub cat file_edit_commands | ed file
.
Zastępowanie ciągów w pliku w miejscu
sed -i s/"what to replace"/"with what to replace"/g $file
Używamy -i
aby wybrać edycję w miejscu $file
. W niektórych systemach wymagane jest dodanie sufiksu po opcji -i
która zostanie użyta do utworzenia kopii zapasowej oryginalnego pliku. Możesz dodać pusty ciąg, np. -i ''
aby pominąć tworzenie kopii zapasowej. Spójrz na uwagi w tym temacie dotyczące opcji -i
.
Terminator g
oznacza globalne znajdowanie / zastępowanie w każdej linii.
$ cat example
one
two
three
total
$ sed -i s/"t"/"g"/g example
$ cat example
one
gwo
ghree
gogal
Przenośne zastosowanie
Edycja w miejscu, choć powszechna, jest funkcją niestandardową. Dobrą alternatywą byłoby użycie pliku pośredniego do przechowywania oryginału lub danych wyjściowych.
sed 'sed commands' > file.out && mv file.out file
# or
mv file file.orig && sed 'sed commands' file.orig > file
Aby użyć opcji -i
zarówno w składni GNU, jak i FreeBSD, należy określić rozszerzenie i dołączyć do opcji -i
. Następujące zostaną zaakceptowane przez oba i file.orig
dwa pliki, oryginalną wersję na file.orig
i edytowaną wersję na file
:
sed -i.orig 'sed commands' file
Zobacz podstawowy przykład z podanym plikiem file
:
$ cat file
one
two
three
$ sed -i.orig 's/one/XX/' file
$ cat file # the original file has changed its content
XX
two
three
$ cat file.orig # the original content is now in file.orig
one
two
three
Bardziej złożony przykład zastąpienia każdej linii numerem linii:
$ printf 'one\ntwo\n' | tee file1 | tr a-z A-Z > file2
$ sed -ni.orig = file1 file2
$ cat file1.orig file2.orig
one
two
ONE
TWO
$ cat file1 file2
1
2
1
2
Dlaczego wymagany jest plik kopii zapasowej
Aby użyć edycji w miejscu bez pliku kopii zapasowej, -i
musi otrzymać argument o zerowej długości, a FreeBSD sed
wymaga argumentu do -i
, dołączonego lub oddzielnego, podczas gdy opcjonalne rozszerzenie argumentu GNU wymaga dołączenia argumentu do -i
. Obie obsługują dodawanie argumentu do -i
, ale bez konieczności użycia polecenia -i'' command
jest nie do odróżnienia od -i extension
, więc argument o zerowej długości nie może być dołączony do -i
.
Edycja w miejscu bez określania pliku kopii zapasowej zastępuje uprawnienia tylko do odczytu
sed -i -e cmd file
zmodyfikuje file
nawet jeśli jego uprawnienia są ustawione tylko do odczytu.
To polecenie działa podobnie do
sed -e cmd file > tmp; mv -f tmp file
zamiast
sed -e cmd file > tmp; cat tmp > file; rm tmp
W poniższym przykładzie użyto gnu sed
:
$ echo 'Extremely important data' > input
$ chmod 400 input # Protect that data by removing write access
$ echo 'data destroyed' > input
-bash: input: Permission denied
$ cat input
Extremely important data (#phew! Data is intact)
$ sed -i s/important/destroyed/ input
$ cat input
Extremely destroyed data (#see, data changed)
Można to złagodzić, tworząc kopię zapasową, określając SUFFIX
z opcją i
:
$ sed -i.bak s/important/destroyed/ input
$ cat input
Extremely destroyed data
$ cat input.bak
Extremely important data