Zoeken…


Syntaxis

  • sed -I extensie - FreeBSD sed (continue lijnteller)
  • sed -I [ extensie ] - NetBSD en Illumos sed (continue lijnteller)
  • sed -i extensie - FreeBSD sed
  • sed -i [ extensie ] - NetBSD, OpenBSD, Illumos, BusyBox en GNU sed
  • sed --in-place [= extensie ] - Illumos, BusyBox en GNU sed

parameters

Parameter Details
extension Sla een back-upbestand op met de opgegeven extensie, of geen back-upbestand wanneer de extension een tekenreeks van nul lengte is.

Opmerkingen

In-place bewerken is een veel voorkomende maar niet-standaard extensie die aanwezig is in de meeste recente systemen.

Uit een BSD sed handleiding

(een sectie als deze verschijnt in alle huidige BSD sed handleidingen, en die van hun derivaten)

Het wordt niet aanbevolen om een extensie van nul lengte te geven tijdens het bewerken van bestanden, omdat het corruptie of gedeeltelijke inhoud riskeert in situaties waarin schijfruimte is uitgeput, enz.

Vergeet de machtige ed

Er is zeker een gebruik voor sed en voor in-place bewerkingsfuncties van sed , maar wanneer de UNIX-standaard wordt uitgebreid, moeten we altijd vragen waarom de oude UNIX-standaard die functie niet bevatte. Hoewel UNIX niet perfect is, is de orthogonaliteit en volledigheid van de tools zo ontwikkeld dat ze bijna perfect zijn, althans voor doeleinden die rond 1970 zichtbaar waren: tekstbewerking en geautomatiseerde tekstbewerking waren rond die tijd zeker zichtbaar.

Het idee van sed is eigenlijk niet om een bestand te bewerken, maar om een stream te bewerken. Daarom is de naam sed een korte vorm van stream-editor . Haal de s weg en je krijgt de tool die eigenlijk is ontworpen voor het bewerken van bestanden : ed :

printf 'g/what to replace/s//with what to replace/g\nw\nq\n' | ed file

of cat file_edit_commands | ed file .

Tekenreeksen op hun plaats vervangen

sed -i s/"what to replace"/"with what to replace"/g $file

We gebruiken -i om in-place bewerking in het $file te selecteren. In sommige systemen is het vereist om een achtervoegsel toe te voegen na -i vlag die zal worden gebruikt om een back-up van het originele bestand te maken. U kunt een lege string zoals -i '' om het maken van de back-up weg te laten. Bekijk opmerkingen in dit onderwerp over de optie -i .

De g terminator betekent een algemene zoekopdracht uitvoeren / vervangen in elke regel.

$ cat example 
one
two
three
total
$ sed -i s/"t"/"g"/g example 
$ cat example 
one
gwo
ghree
gogal

Draagbaar gebruik

In-place bewerken, hoewel gebruikelijk, is een niet-standaard functie. Een uitvoerbaar alternatief zou zijn om een tussenbestand te gebruiken om het origineel of de uitvoer op te slaan.

sed 'sed commands' > file.out && mv file.out file
# or
mv file file.orig && sed 'sed commands' file.orig > file

Om de optie -i gebruiken met zowel de GNU- als FreeBSD-syntaxis, moet een extensie worden opgegeven en aan de optie -i worden toegevoegd. Het volgende wordt door beide geaccepteerd en produceert twee bestanden, de oorspronkelijke versie in file.orig en de bewerkte versie in file :

sed -i.orig 'sed commands' file

Bekijk een basisvoorbeeld met een 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

Een complexer voorbeeld waarbij elke regel wordt vervangen door regelnummer:

$ 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

Waarom een back-upbestand vereist is

Om ter plekke bewerken te gebruiken zonder back-upbestand, moet -i een lengte-lengteargument krijgen en FreeBSD sed vereist een argument aan -i , toegevoegd of afzonderlijk, terwijl de GNU optionele argumentuitbreiding vereist dat het argument wordt toegevoegd -i . Beide ondersteunen het toevoegen van het argument aan -i , maar zonder dat het nodig is, is het -i'' command niet te onderscheiden van de -i extension , en daarom kan een argument van nullengte niet worden toegevoegd aan -i .

Ter plekke bewerken zonder een back-upbestand op te geven, vervangt alleen-lezenrechten

sed -i -e cmd file zal het sed -i -e cmd file wijzigen file zelfs als de machtigingen zijn ingesteld op alleen-lezen.

Dit commando gedraagt zich hetzelfde als

sed -e cmd file > tmp; mv -f tmp file

liever dan

sed -e cmd file > tmp; cat tmp > file; rm tmp

In het volgende voorbeeld wordt 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)

Dit kan worden beperkt door een back-up te maken door een SUFFIX met de optie 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow