sed
Redigering på plats
Sök…
Syntax
- sed -I förlängning - FreeBSD sed (kontinuerlig räknare)
- sed -I [ förlängning ] - NetBSD och Illumos sed (kontinuerlig räknare)
- sed -i förlängning - FreeBSD sed
- sed -i [ tillägg ] - NetBSD, OpenBSD, Illumos, BusyBox och GNU sed
- sed - in-place [= förlängning ] - Illumos, BusyBox och GNU sed
parametrar
Parameter | detaljer |
---|---|
extension | Spara en säkerhetskopieringsfil med det angivna tillägget, eller ingen säkerhetskopieringsfil när extension är en sträng med noll längd. |
Anmärkningar
Redigering på plats är en vanlig men icke-standardförlängning som finns i majoriteten av de senaste systemen.
Från en BSD sed
manual
(ett avsnitt som detta visas i alla aktuella BSD- sed
manualer och deras derivat)
Det rekommenderas inte att ge en förlängning med noll längd när du redigerar filer på plats, eftersom det riskerar korruption eller partiellt innehåll i situationer där hårddiskutrymme är slut, etc.
Glöm inte den mäktiga ed
Det finns definitivt en användning för sed
och för att redigera funktioner på sed
, men när UNIX-standarden utvidgas bör vi alltid fråga varför den gamla UNIX-standarden inte inkluderade den funktionen. Även om UNIX inte är perfekt har verktygens ortogonalitet och fullständighet utvecklats för att vara ganska nära perfektion, åtminstone för ändamål som var synliga runt 1970: Textredigering och automatiserad textredigering var säkert synlig runt den tiden.
I själva verket är idén med sed
inte att redigera en fil på plats, utan att redigera en ström . Det är därför namnet sed
är en kort form av streameditor . Ta bort s
, och du får verktyg som faktiskt var avsedd för fil redigering: ed
:
printf 'g/what to replace/s//with what to replace/g\nw\nq\n' | ed file
eller cat file_edit_commands | ed file
.
Byta ut strängar i en fil på plats
sed -i s/"what to replace"/"with what to replace"/g $file
Vi använder -i
att välja redigering på plats i $file
. I vissa system krävs det att lägga till suffix efter -i
flaggan som kommer att användas för att skapa säkerhetskopiering av originalfil. Du kan lägga till tom sträng som -i ''
att utelämna skapandet av säkerhetskopiering. Titta på anmärkningar i detta ämne om -i
alternativet.
g
terminatorn betyder en global sökning / ersättning i varje rad.
$ cat example
one
two
three
total
$ sed -i s/"t"/"g"/g example
$ cat example
one
gwo
ghree
gogal
Bärbar användning
Även om det är vanligt är redigering på plats en funktion som inte är standard. Ett genomförbart alternativ skulle vara att använda en mellanfil för att antingen lagra originalet eller utgången.
sed 'sed commands' > file.out && mv file.out file
# or
mv file file.orig && sed 'sed commands' file.orig > file
För att använda -i
alternativet med både GNU- och FreeBSD-syntax måste ett tillägg anges och bifogas till -i
alternativet. Följande kommer att accepteras av båda och producera två filer, den ursprungliga versionen på file.orig
och den redigerade versionen vid file
:
sed -i.orig 'sed commands' file
Se ett grundläggande exempel med en 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
Ett mer komplext exempel som ersätter varje rad med radnummer:
$ 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
Varför en reservfil krävs
För att kunna använda redigering på plats utan en säkerhetskopieringsfil måste -i
ges ett argument med noll längd och FreeBSD sed
kräver ett argument till -i
, antingen bifogat eller separat, medan GNU-valfritt argumentförlängning kräver att argumentet bifogas -i
. Båda stöder att lägga till argumentet till -i
, men utan att det krävs -i'' command
skiljas från -i extension
, och därför kan ett argument med noll längd inte läggas till -i
.
Redigering på plats utan att ange en säkerhetskopiafil åsidosätter skrivskyddstillstånd
sed -i -e cmd file
kommer att ändra file
även om dess behörigheter är inställd på skrivskyddad.
Detta kommando fungerar på samma sätt som
sed -e cmd file > tmp; mv -f tmp file
hellre än
sed -e cmd file > tmp; cat tmp > file; rm tmp
Följande exempel använder 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)
Detta kan mildras genom att skapa en säkerhetskopia genom att ange en SUFFIX
med i
alternativet:
$ sed -i.bak s/important/destroyed/ input
$ cat input
Extremely destroyed data
$ cat input.bak
Extremely important data