Welcome to Our Website

A sed Stream szerkesztő használatának alapjai a szöveg manipulálásához Linuxban

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-sedhasználatával.

indítson el egy interaktív terminált!

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 sedkí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:

Output
Copyright (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 sedszerkeszté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:

Output
Copyright (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:

Output
Copyright (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:

Output
Copyright (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:

Output
Copyright (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:

Output
Copyright (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:

Output
All 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:

Output
All 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:

Output
sed: -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:

Output
this 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 onsongforward – 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:

Output
this 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:

Output
this 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:

Output
yes, 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:

Output
this 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 atutolsó 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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük