Úvod
sed
příkaz, krátký pro stream editor, provádí operace úprav na text pocházející ze standardního vstupu nebo souboru. sed
upravuje line-by-line a neinteraktivním způsobem.
to znamená, že při volání příkazu provedete všechna rozhodnutí o úpravách ased
provede pokyny automaticky., To se může zdát matoucí nebo neintuitivní, ale je to velmi silný a rychlý způsob, jak transformovat text, zejména jako součást skriptu nebo automatizovaného pracovního postupu.
tento tutoriál bude pokrývat některé základní operace a představí vám syntaxi potřebnou k ovládání tohoto editoru. Téměř jistě nikdy nenahradíte běžný textový editor sed
, ale pravděpodobně se stane vítaným doplňkem k panelu nástrojů pro úpravu textu.
Poznámka: Tento tutoriál používá verzi GNU sed
nalezenou na Ubuntu a dalších operačních systémech Linux., Pokud používáte macOS, budete mít verzi BSD, která má různé možnosti a argumenty. Můžete nainstalovat GNU verzi sed
s Homebrew pomocí brew install gnu-sed
.
Základní Použití
sed
působí na proud textu, který čte buď z textového souboru nebo ze standardního vstupu (STDIN). To znamená, že můžete odeslat výstup jiného příkazu přímo do sed pro editaci, nebo můžete pracovat na souboru, který jste již vytvořili.,
měli byste si také být vědomi toho, že sed
ve výchozím nastavení vysílá vše do standard out (STDOUT). To znamená, že pokud není přesměrován, sed
vytiskne svůj výstup na obrazovku místo uložení do souboru.
základní použití je:
- sed commands
V této lekci, budete používat kopii BSD Licence na Software experimentovat s sed
., Na Ubuntu, spusťte následující příkazy kopírovat BSD licenční soubor do svého domovského adresáře, takže můžete pracovat s tím:
- cd
- cp /usr/share/common-licenses/BSD .
Pokud nemáte lokální kopii BSD licence, vytvořit sami pomocí tohoto příkazu:
- 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
použijme sed
chcete-li zobrazit obsah z BSD licenční soubor. sed
posílá své výsledky na obrazovce ve výchozím nastavení, což znamená, můžete jej použít jako soubor karet průchodem žádné editační příkazy., Zkuste spustit následující příkaz:
- sed '' BSD
uvidíte, že BSD licence zobrazí na obrazovce:
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.......
single citáty obsahují editační příkazy můžete projít do sed
. V tomto případě jste nic nepředali, takže sed
vytiskl každý řádek, který obdržel, na standardní výstup.
sed
lze použít spíše standardní vstup než soubor., Potrubí výstup cat
příkaz do sed
produkovat stejný výsledek:
- cat BSD | sed ''
uvidíte výstupního souboru:
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.. . .. . .
Jak můžete vidět, můžete pracovat na soubory, nebo proudy textu, jako ty, které vyrábí, když výstupní potrubí s potrubí (|)
charakter, stejně snadno.
Tisk Řádků
V předchozím příkladě jste viděli, že input přešel do sed
bez operace by vytisknout výsledky přímo na standardní výstup.,
Pojďme se podívat sed
‚s explicitní print
příkaz, který zadáte pomocí p
znak v jednoduchých uvozovkách.
Spustit následující příkaz:
- sed 'p' BSD
uvidíte, že každý řádek BSD
soubor vytištěn dvakrát:
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
automaticky vytiskne každou řádku ve výchozím nastavení a pak jste to řekl na tiskové linky výslovně s „p“ příkaz, takže si každý řádek vytištěn dvakrát.,
Pokud výstup pečlivě prozkoumáte, uvidíte, že má první řádek dvakrát, následuje druhý řádek dvakrát atd., který vám řekne, že sed
pracuje na datové lince po řádku. Čte řádek, pracuje na něm a před opakováním procesu na dalším řádku vydává výsledný text.
můžete vyčistit výsledků, předáním -n
možnost sed
, který potlačuje automatický tisk:
- sed -n 'p' BSD
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.. . .. . .
Jsme nyní jsou zpět, aby tisk každý řádek jednou.,
příklady lze zatím jen stěží považovat za úpravy (pokud jste nechtěli vytisknout každý řádek dvakrát…). Dále prozkoumáte, jak sed
může upravit výstup cílením na konkrétní části textových dat.
použití adresových rozsahů
adresy umožňují cílit na konkrétní části textového proudu. Můžete zadat konkrétní řádek nebo dokonce řadu řádků.
pojďme sed
vytisknout první řádek souboru., Spustit následující příkaz:
- sed -n '1p' BSD
první řádek vytiskne na obrazovku:
OutputCopyright (c) The Regents of the University of California.
Tím, že umístí číslo 1
„tisk“ příkaz, řekl, sed
číslo řádku operovat. Můžete stejně snadno vytisknout pět řádků (nezapomeňte na „-n“):
- sed -n '1,5p' BSD
uvidíte, že tento výstup:
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
právě Jste daný rozsah adres, aby sed
., Pokud zadátesed
adresu, provede pouze příkazy, které následují na těchto řádcích. V tomto příkladu jste řekl sed, aby vytiskl linku 1 přes linku 5. Mohl jsi uvedeno jinak tím, že první adresu a pak pomocí offset říct, sed, kolik dalších řádků, jak cestovat, jako je tento:
- sed -n '1,+4p' BSD
To bude mít za následek stejný výstup, protože jsi řekl, sed
začít na řádku 1 a pak pracovat na další 4 řádky stejně.,
Pokud chcete vytisknout každý druhý řádek, zadejte interval za znakem~
. Následující příkaz vytiskne každý další řádek BSD
souboru, počínaje 1. řádek:
- sed -n '1~2p' BSD
výstup:
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. . .. . .
můžete použít sed
odstranit text z výstupního stejně.,
Mazání Textu
můžete provést odstranění textu, kde jste předtím byli s uvedením tisk textu změnou p
příkaz d
příkaz.
V tomto případě, budete již potřebovat -n
příkaz sed
bude tisknout vše, co není odstraněn. To vám pomůže zjistit, co se děje.,
Změnit poslední příkaz z předchozí části, aby to bylo
odstranit každý druhý řádek počínaje prvním:
- sed '1~2d' BSD
výsledkem je, že vidíte každý řádek jsi nedal, naposledy:
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.. . .. . .
je důležité si uvědomit, že náš zdrojový soubor není ovlivněn. Je stále neporušená. Úpravy jsou výstupem na naši obrazovku.,
chceme-Li zachránit naše úpravy, můžeme přesměrovat standardní výstup do souboru jako:
- sed '1~2d' BSD > everyother.txt
otevřít soubor cat
:
- cat everyother.txt
vidíš ten stejný výstup, který jste viděli na obrazovce dříve:
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.. . .. . .
sed
příkaz nepodporuje editaci zdrojového souboru, ve výchozím nastavení, ale můžete změnit toto chování tím, že projde -i
možnost, což znamená „provést úpravy v místě.“Tím se změní zdrojový soubor.,
varování: pomocí přepínače-i
přepíšete původní soubor, takže byste jej měli používat opatrně. Proveďte operace bez -i
přepnout první a potom spusťte příkaz znovu s -i
jakmile budete mít to, co chcete, vytvořit zálohu původního souboru, nebo přesměrovat výstup do souboru. Je velmi snadné náhodně změnit původní soubor pomocí přepínače -i
.
zkusme to úpravou souboru everyother.txt
, který jste právě vytvořili, na místě., Pojďme dále snížit soubor odstraněním každý druhý řádek
znovu:
- sed -i '1~2d' everyother.txt
Pokud použijete cat
zobrazení souboru s cat everyother.txt
, uvidíte, že soubor byl upraven.
možnost-i
může být nebezpečná. Naštěstí, sed
vám dává možnost vytvořit záložní soubor před úpravami.,
Chcete-li vytvořit záložní soubor před editaci, přidat zálohování souboru přímo po „-i“ volbu:
- sed -i.bak '1~2d' everyother.txt
tím se vytvoří záložní soubor s .bak
rozšíření, a pak upraví původní soubor v místě.
dále se podíváte na to, jak používatsed
k provádění operací vyhledávání a nahrazování.
nahrazující Text
možná nejznámější použití pro sed
nahrazuje text., sed
může vyhledávat textové vzory pomocí regulárních výrazů a poté nalezený text nahradit něčím jiným.
o regulárních výrazech se můžete dozvědět více pomocí regulárních výrazů Grep pro vyhledávání textových vzorů v Linuxu.
Ve své nejzákladnější podobě, můžete změnit jedno slovo další slovo pomocí následující syntaxe:
's/old_word/new_word/'
s
je náhradní příkaz. Tři lomítka (/
) se používají k oddělení různých textových polí., Můžete použít jiné znaky vymezit pole, pokud by to bylo více užitečné.
například pokud jste se snažili změnit název webové stránky, bylo by užitečné použít jiný oddělovač, protože adresy URL obsahují lomítka.
Spustit následující příkaz k tisku URL s echo
upravit sed
, pomocí podtržení (_
) znak jako oddělovač:
- echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'
Tento nahradil com/index
org/home
., Výstup ukazuje, že upravená URL:
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'
měli Byste vidět výstup:
Outputsed: -e expression #1, char 20: unterminated `s' command
Pojďme vytvořit nový soubor do praxe některé substituce. Spusťte následující příkaz vytvořit nový textový soubor s názvem 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
Teď pojďme nahradit výraz on
forward
. Zadejte následující příkaz:
- sed 's/on/forward/' song.txt
výstup vypadá takto:
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...
můžete se podívat na několik pozoruhodných věcí., Za prvé, je to sed
nahrazené vzory, nikoli slova. on
v song
se změní na forward
.
další věc, kterou musíte vědět je, že on-line 2, druhý on
změnit na forward
.
je to proto, že ve výchozím nastavení příkaz s
pracuje na prvním zápase v řádku a poté se přesune na další řádek., Chcete-li sed
nahradit každou instanci on
místo prvního na každém řádku musíte nahradit volitelný příznak.
Poskytnout g
vlajky na náhradu příkaz tím, že po substituci sada:
- sed 's/on/forward/g' song.txt
uvidíte, že tento výstup:
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...
nahradit příkaz změní pokaždé.,
Pokud jste pouze chtěli změnit druhého stupně, „na“, že sed najde na každém řádku, pak byste měli použít číslo 2
místo g
:
- sed 's/on/forward/2' song.txt
Tento čas ostatní řádky se nemění, protože nemají druhém výskytu:
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...
Pokud si jen chcete vidět, které řádky byly nahrazeny, použijte -n
možnost znovu potlačit automatický tisk.,
možnost p
pak můžete předat náhradnímu příkazu k tisku řádků, kde došlo k substituci.
- sed -n 's/on/forward/2p' song.txt
řádek, který změnil otisky obrazovky:
Outputyes, it goes on and forward, my friend
Jak vidíte, můžete kombinovat vlajek na konci příkazu.
Pokud chcete, aby proces vyhledávání ignoroval případ, můžete mu předat příznak „i“.,
- sed 's/SINGING/saying/i' song.txt
výstup:
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...
Výměna a Odkazování na odpovídající Text
Pokud chcete najít více složité vzory s regulárními výrazy, máte řadu různých metod odkazování na odpovídající vzor v na náhradní text.,
například, zápas od začátku řádku do at
, použijte následující příkaz:
- sed 's/^.*at/REPLACED/' song.txt
uvidíte, že tento výstup:
Output REPLACED never endsyes, it goes on and on, my friendsome people started singing itREPLACED it wasand they'll continue singing it foreverjust because...
můžete vidět, že výraz se zástupnými znaky zápasy od začátku řádku poslední instance at
.
Protože nevíte, přesnou frázi, která bude odpovídat ve vyhledávací řetězec, můžete použít &
znak reprezentující odpovídající text v náhradní řetězec.,
Pojďme dát závorky kolem uzavřeno text:
- sed 's/^.*at/(&)/' song.txt
uvidíte, že tento výstup:
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...
více flexibilní způsob odkazování na odpovídající text, je použít utekl závorky do skupiny úseky odpovídající text.
každá skupina vyhledávacího textu označená závorkami může být odkazována uniklým referenčním číslem. Například, první závorky skupina může být odkazoval se na s \1
druhý \2
, a tak dále.,
V tomto příkladu, budeme přepínat první dvě slova každého řádku:
- sed 's/\(*\) \(*\)/\2 \1/' song.txt
uvidíte, že tento výstup:
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...
Jak můžete vidět, výsledky nejsou ideální. Například druhý řádek přeskočí první slovo, protože má znak, který není uveden v naší znakové sadě. Podobně zacházelo s they'll
jako se dvěma slovy v pátém řádku.
Pojďme zlepšit regulární výraz, aby to bylo přesnější:
- sed 's/\(*\) \(*\)/\2 \1/' song.txt
uvidíte, že tento výstup:
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
je To mnohem lepší, než minule., Toto seskupuje interpunkci s přidruženým slovem.
Všimněte si, jak opakujeme výraz uvnitř závorek (jednou bez znaku *
a poté jednou s ním). Je to proto, že znak *
odpovídá znakové sadě, která přichází před nulou nebo vícekrát. To znamená, že zápas s divokou kartou by byl považován za“ zápas“, i když vzor není nalezen.
zajistit, Aby sed
najde text alespoň jednou, ty se musí shodovat to jednou bez zástupných před upotřebením zástupný.,
závěr
v tomto tutoriálu jste prozkoumali příkaz sed
. Vytiskli jste konkrétní řádky ze souboru, hledali text, smazali řádky, přepsali původní soubor a použili regulární výrazy k nahrazení textu. Měli byste být schopni vidět, jak můžete rychle transformovat textový dokument pomocí správně konstruovaných příkazů sed.
V dalším článku v této sérii prozkoumáte některé pokročilejší funkce.