Bevezetés
a sed
parancs, a stream szerkesztő rövidítése, szerkesztési műveleteket hajt végre a szabványos bemenetből vagy fájlból érkező szövegen. sed
szerkeszti soronkénti és nem interaktív módon.
Ez azt jelenti, hogy az összes szerkesztési döntést a parancs hívásakor hozza meg, a sed
pedig automatikusan végrehajtja az utasításokat., Ez zavarónak vagy unintuitívnak tűnhet, de nagyon hatékony és gyors módja a szöveg átalakításának, különösen egy szkript vagy automatizált munkafolyamat részeként.
Ez az oktatóanyag néhány alapvető műveletet lefed, és bemutatja a szerkesztő működtetéséhez szükséges szintaxist. Szinte biztosan soha nem fogja helyettesíteni a szokásos szövegszerkesztőt sed
, de valószínűleg üdvözlendő kiegészítéssé válik a szövegszerkesztő eszköztárában.
Megjegyzés: Ez a bemutató a sed
GNU verzióját használja Ubuntuban és más Linux operációs rendszereken., Ha macOS-t használ, akkor a BSD verziója különböző opciókkal és argumentumokkal rendelkezik. A sed
GNU verzióját a Homebrew segítségével telepítheti a brew install gnu-sed
használatával.
Basic Usage
sed
olyan szövegfolyamon működik, amelyet szöveges fájlból vagy szabványos bemenetből (STDIN) olvas. Ez azt jelenti, hogy egy másik parancs kimenetét közvetlenül a sed-be küldheti szerkesztésre, vagy dolgozhat egy már létrehozott fájlon.,
azt is tudnia kell, hogy ased
alapértelmezés szerint mindent szabványos kimenetre (STDOUT) ad ki. Ez azt jelenti, hogy az átirányítás nélkül ased
kinyomtatja kimenetét a képernyőre, ahelyett, hogy fájlba mentené.
az alapvető használat:
- sed commands
ebben a bemutatóban a BSD Szoftverlicencének egy példányát használja a sed
kísérletezéshez., Ubuntuban hajtsa végre a következő parancsokat a BSD licencfájl másolásához a saját könyvtárába, hogy vele dolgozhasson:
- cd
- cp /usr/share/common-licenses/BSD .
Ha nincs helyi példánya a BSD licencnek, hozzon létre egyet ezzel a paranccsal:
- cat << 'EOF' > BSD
- Copyright (c) The Regents of the University of California.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- EOF
használjuk a sed
a BSD licencfájl tartalmának megtekintéséhez. sed
alapértelmezés szerint elküldi eredményeit a képernyőre, ami azt jelenti, hogy fájlolvasóként használhatja, ha nem adja át szerkesztési parancsokat., Próbálja meg végrehajtani a következő parancsot:
- sed '' BSD
látni fogja a képernyőn megjelenő BSD licencet:
OutputCopyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.......
az egyes idézetek tartalmazzák a sed
szerkesztési parancsokat. Ebben az esetben semmit sem adtál át, így a sed
kinyomtatta az egyes sorokat, amelyeket szabványos kimenetre kapott.
sed
szabványos bemenetet használhat a fájl helyett., A cat
parancs kimenete a sed
parancsba, hogy ugyanazt az eredményt hozza:
- cat BSD | sed ''
megjelenik a fájl kimenete:
OutputCopyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .
mint látható, akkor működik a fájlokat vagy stream a szöveg, mint azok termelt csővezeték kimenet a cső (|)
karakter, ugyanolyan könnyen.
nyomtatási vonalak
az előző példában látta, hogy a bemenet a sed
– ba kerül, anélkül, hogy bármilyen művelet kinyomtatná az eredményeket közvetlenül a standard kimenetre.,
fedezzük fel ased
‘s explicitprint
parancsot, amelyet ap
karakter segítségével ad meg egyetlen idézőjelben.
hajtsa végre a következő parancsot:
- sed 'p' BSD
aBSD
fájl minden sorát kétszer nyomtatva látja:
OutputCopyright (c) The Regents of the University of California.Copyright (c) The Regents of the University of California.All rights reserved.All rights reserved.Redistribution and use in source and binary forms, with or withoutRedistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsmodification, are permitted provided that the following conditionsare met:are met:. . .. . .
sed
alapértelmezés szerint automatikusan kinyomtatja az egyes sorokat, majd azt mondta, hogy kifejezetten nyomtassa ki a sorokat a “p” paranccsal, így minden sort kétszer kinyomtat.,
ha alaposan megvizsgálja a kimenetet, látni fogja, hogy az első sor kétszer, majd a második sor kétszer, stb., amely azt mondja, hogy a sed
adatsoronként működik. Egy sort olvas, rajta működik, majd a következő sorban megismétli a folyamatot.
az eredményeket megtisztíthatja a -n
sed
opcióval, amely elnyomja az automatikus nyomtatást:
- sed -n 'p' BSD
vissza nyomtatni minden sorban egyszer.,
az eddigi példákat alig lehet szerkesztésnek tekinteni (hacsak nem akart minden sort kétszer kinyomtatni…). Ezután megtudhatja, hogy ased
hogyan módosíthatja a kimenetet a szöveges adatok meghatározott szakaszainak célzásával.
A címtartományok használata
a címek lehetővé teszik a szövegfolyam meghatározott részeinek megcélzását. Megadhat egy adott sort vagy akár egy sor Sort.
let ‘s have sed
print the first line of the file., Hajtsa végre a következő parancsot:
- sed -n '1p' BSD
az első sor a képernyőre nyomtat:
OutputCopyright (c) The Regents of the University of California.
a 1
a nyomtatási parancs előtt azt mondta: sed
div > a működtetni kívánt sorszám. Ugyanolyan könnyen nyomtathat öt sort (ne felejtse el a “-n” – t):
- sed -n '1,5p' BSD
látni fogja ezt a kimenetet:
OutputCopyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditions
éppen megadott egy címtartományt sed
., Ha sed
címet ad meg, akkor csak azokat a parancsokat hajtja végre, amelyek ezeken a sorokon követik. Ebben a példában azt mondta a sed-nek, hogy nyomtassa ki az 1.sort az 5. vonalon keresztül. Mondhatta volna, hogy ez más-más módon azáltal, hogy az első cím, akkor használja az eltolás mondani, sed hány további vonalakon utazni, így:
- sed -n '1,+4p' BSD
Ez azt eredményezi, hogy ugyanazt a kimenetet, mert te azt mondtad sed
kezdeni vonal, 1-es, majd működtetni a következő 4 sor is.,
ha minden más sort ki szeretne nyomtatni, adja meg a ~
karakter utáni intervallumot. A következő parancs kiírja az összes többi sort a BSD
fájlban, kezdve az 1 sorral:
- sed -n '1~2p' BSD
itt látható a kimenet:
OutputCopyright (c) The Regents of the University of California.modification, are permitted provided that the following conditions1. Redistributions of source code must retain the above copyright2. Redistributions in binary form must reproduce the above copyright documentation and/or other materials provided with the distribution. may be used to endorse or promote products derived from this software. . .. . .
használhatja a sed
szöveg törlése a kimenetből is.,
Szöveg törlése
a szöveg törlését a p
parancsnak a d
parancsra történő módosításával végezheti el.
ebben az esetben már nincs szüksége a -n
parancsra, mert a sed
kinyomtat mindent, ami nem törlődik. Ez segít látni, mi folyik itt.,
módosítsa az előző szakasz utolsó parancsát, hogy az
törölje az összes többi sort az elsőtől kezdve:
- sed '1~2d' BSD
az eredmény az, hogy minden olyan sort lát, amelyet utoljára nem kapott:
OutputAll rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .
fontos megjegyezni, hogy a forrásfájlt nem érinti. Még mindig sértetlen. A szerkesztések a képernyőn jelennek meg.,
Ha meg akarjuk menteni a módosításokat, irányítható szabványos kimeneti fájl valahogy így:
- sed '1~2d' BSD > everyother.txt
nyissa meg a fájlt cat
:
- cat everyother.txt
látod, Hogy ugyanazt a kimenetet, hogy láttam a képernyőn korábban:
OutputAll rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .
A sed
parancs nem szerkesztheti a forrás fájl alapértelmezés szerint, de meg lehet változtatni, ez a viselkedés átadásával a -i
lehetőséget, ami azt jelenti, hogy “végre szerkeszti a hely.”Ez megváltoztatja a forrásfájlt.,
figyelmeztetés: A-i
kapcsoló felülírja az eredeti fájlt, ezért ezt óvatosan kell használni. Végezze el a műveleteket a -i
kapcsoló nélkül, majd futtassa újra a parancsot a -i
miután megkapta, amit akar, készítsen biztonsági másolatot az eredeti fájlról, vagy irányítsa át a kimenetet egy fájlra. Nagyon könnyű véletlenül megváltoztatni az eredeti fájlt a -i
kapcsolóval.
próbáljuk ki az éppen létrehozott everyother.txt
fájl szerkesztésével., Tovább csökkentsük a fájlt minden más
sor törlésével:
- sed -i '1~2d' everyother.txt
ha cat
fájlt használ a cat everyother.txt
fájl megjelenítéséhez, látni fogja, hogy a fájl szerkesztésre került.
a-i
opció veszélyes lehet. Szerencsére ased
lehetővé teszi a biztonsági mentési fájl létrehozását a Szerkesztés előtt.,
biztonsági mentési fájl létrehozásához a Szerkesztés előtt adja hozzá a biztonsági mentési kiterjesztést közvetlenül a “- i “opció után:
- sed -i.bak '1~2d' everyother.txt
Ez létrehoz egy biztonsági mentési fájlt a .bak
kiterjesztéssel, majd szerkeszti az eredeti fájlt a helyén.
ezután megnézheti, hogyan kell használni a sed
a keresési műveletek végrehajtásához.
szöveg helyettesítése
a sed
talán a legismertebb használat a szöveget helyettesíti., sed
szöveges mintákat kereshet reguláris kifejezésekkel, majd cserélje ki a talált szöveget valami másra.
a reguláris kifejezésekről többet tudhat meg a grep reguláris kifejezések használatával, hogy szöveges mintákat keressen Linuxban.
legalapvetőbb formájában az egyik szót egy másik szóra módosíthatja a következő szintaxis használatával:
's/old_word/new_word/'
a s
a helyettesítő parancs. A különböző szövegmezők elválasztására a három hasáb (/
) használható., Más karaktereket is használhat a mezők határolására, ha ez hasznosabb lenne.
például, ha egy webhely nevét próbálta megváltoztatni, akkor egy másik határoló használata hasznos lenne, mivel az URL-ek vágásokat tartalmaznak.
hajtsa végre a következő parancsot a echo
URL nyomtatásához, majd módosítsa azt sed
, az aláhúzás (_
) karakter mint delimiter:
- echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'
/div>
Ez a org/home
helyébe lép., A kimenet a módosított URL-t mutatja:
Output
Do not forget the final delimiter, or sed
will complain. If you ran this command:
- echo "http://www.example.com/index.html" | sed 's_com/index_org/home'
ezt a kimenetet látja:
Outputsed: -e expression #1, char 20: unterminated `s' command
hozzunk létre egy új fájlt néhány helyettesítés gyakorlásához. Hajtsa végre a következő parancsot a song.txt
:
- echo "this is the song that never ends
- yes, it goes on and on, my friend
- some people started singing it
- not knowing what it was
- and they'll continue singing it forever
- just because..." > song.txt
most helyettesítsük a on
kifejezést forward
. Használja a következő parancsot:
- sed 's/on/forward/' song.txt
a kimenet így néz ki:
Outputthis is the sforwardg that never endsyes, it goes forward and on, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...
itt néhány figyelemre méltó dolgot láthat., Először is, hogy sed
helyettesített minták, nem szavak. A on
song
forward
– ra változik.
a másik dolog, amit észre kell venni, hogy a 2. sorban a második on
nem változott forward
.
Ez azért van, mert alapértelmezés szerint as
parancs egy sor első mérkőzésén működik, majd a következő sorra lép., Ahhoz, hogy a sed
cserélje ki a on
minden sor első példánya helyett egy opcionális zászlót kell átadnia a helyettesítő parancsnak.
Nyújt a g
zászlót, hogy a helyettesítő parancs által forgalomba, miután a helyettesítő set:
- sed 's/on/forward/g' song.txt
ez kimenet:
Outputthis is the sforwardg that never endsyes, it goes forward and forward, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...
a helyettes parancsnoki változások minden esetben.,
Ha csak az “on” második példányát szeretné megváltoztatni, amelyet sed talál minden sorban, akkor a 2
számot használja a g
:
- sed 's/on/forward/2' song.txt
ezúttal a többi sor változatlan, mivel nincs második előfordulásuk:
Outputthis is the song that never endsyes, it goes on and forward, my friendsome people started singing itnot knowing what it wasand they'll continue singing it foreverjust because...
Ha csak azt szeretné látni, hogy mely vonalakat helyettesítették, használja a -n
opciót az automatikus nyomtatás elnyomásához.,
ezután átadhatja ap
opciót a helyettesítő parancsnak, hogy olyan sorokat nyomtasson, ahol a helyettesítés megtörtént.
- sed -n 's/on/forward/2p' song.txt
az a sor, amely megváltoztatta a nyomtatásokat a képernyőre:
Outputyes, it goes on and forward, my friend
mint látható, a parancs végén kombinálhatja a zászlókat.
Ha azt szeretné, hogy a keresési folyamat figyelmen kívül hagyja az esetet, átadhatja az “i” zászlót.,
- sed 's/SINGING/saying/i' song.txt
itt látható a kimenet:
Outputthis is the song that never endsyes, it goes on and on, my friendsome people started saying itnot knowing what it wasand they'll continue saying it foreverjust because...
párosított Szöveg cseréje és hivatkozása
ha összetettebb mintákat szeretne találni a reguláris kifejezésekkel, akkor számos különböző módszerrel hivatkozhat az illesztett mintára a helyettesítő szövegben.,
például ahhoz, hogy a sor elejétől a at
– hoz illeszkedjen, használja a következő parancsot:
- sed 's/^.*at/REPLACED/' song.txt
ezt a kimenetet látja:
Output REPLACED never endsyes, it goes on and on, my friendsome people started singing itREPLACED it wasand they'll continue singing it foreverjust because...
a at
utolsó példányának sora.
mivel nem ismeri a pontos kifejezést, amely megegyezik a keresési karakterláncban, használhatja a &
karaktert, hogy képviselje az illesztett szöveget a helyettesítő karakterláncban.,
zárójeleket tegyünk az illesztett szöveg köré:
- sed 's/^.*at/(&)/' song.txt
látni fogja ezt a kimenetet:
Output (this is the song that) never endsyes, it goes on and on, my friendsome people started singing it(not knowing what) it wasand they'll continue singing it foreverjust because...
a párosított szöveg hivatkozásának rugalmasabb módja a szökött zárójelek használata az illesztett szöveg csoportszakaszaihoz.
a zárójelekkel jelölt keresési szöveg minden csoportjára hivatkozhat egy megszökött hivatkozási szám. Például az első zárójeles csoport hivatkozhat a \1
, a második a \2
stb.,
ebben a példában minden sor első két szavát átkapcsoljuk:
- sed 's/\(*\) \(*\)/\2 \1/' song.txt
látni fogja ezt a kimenetet:
Output is this the song that never endsyes, goes it on and on, my friendpeople some started singing itknowing not what it wasthey and'll continue singing it foreverbecause just...
amint láthatja, az eredmények nem tökéletesek. Például a második sor kihagyja az első szót, mert olyan karakterrel rendelkezik, amely nem szerepel a karakterkészletünkben. Hasonlóképpen a they'll
– t két szóval kezelte az ötödik sorban.
javítsuk a reguláris kifejezést, hogy pontosabb legyen:
- sed 's/\(*\) \(*\)/\2 \1/' song.txt
látni fogja ezt a kimenetet:
Output is this the song that never endsit yes, goes on and on, my friendpeople some started singing itknowing not what it wasthey'll and continue singing it foreverbecause... just
Ez sokkal jobb, mint legutóbb., Ez csoportosítja az írásjeleket a kapcsolódó szóval.
figyeljük meg, hogyan ismételjük meg a kifejezést a zárójelben (egyszer a *
karakter nélkül, Majd egyszer vele). Ennek oka az, hogy a *
karakter megegyezik az előtte lévő karakterkészlettel nulla vagy több alkalommal. Ez azt jelenti, hogy a mérkőzés a helyettesítő lenne tekinthető “mérkőzés” akkor is, ha a minta nem található.
annak biztosítása érdekében, hogy ased
legalább egyszer megtalálja a szöveget, egyszer meg kell egyeznie a helyettesítő nélkül, mielőtt a helyettesítő kártyát alkalmazná.,
következtetés
ebben a bemutatóban feltárta a sed
parancsot. Bizonyos sorokat nyomtatott a fájlból, keresett szöveget, törölt sorokat, felülírta az eredeti fájlt, és reguláris kifejezéseket használt a szöveg helyettesítésére. Meg kell tudni, hogy már hogyan lehet gyorsan átalakítani egy szöveges dokumentum segítségével megfelelően épített sed parancsokat.
a sorozat következő cikkében néhány fejlettebb funkciót fedez fel.