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.

Z podręcznika BSD sed

(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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow