sed
Ter plekke bewerken
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