Úvod
SED je editor textových proudů používaný na systémech Unix k rychlé a efektivní úpravě souborů. Nástroj prohledává, nahrazuje, přidává a odstraňuje řádky v textovém souboru bez otevření souboru v textovém editoru.
Naučte se používat sed
příkaz a jeho možnosti prostřednictvím snadno pochopitelných příkladů.
Linux sed Syntaxe
Hlavní syntaxe pro použití Linuxu sed
příkaz je:
sed OPTIONS... [SCRIPT] [INPUTFILE...]
Sed Linux Options
Můžete spustit sed
s následujícími možnostmi příkazového řádku:
-b , --binary | Otevřete vstupní soubory v binárním režimu, abyste zvážili, že řádky končí na řádku. |
--debug | Přepněte do režimu ladění, abyste mohli tisknout vstup v kanonické podobě a komentovat provádění programu. |
--follow-symlinks | Upravte konečný cíl, pokud je zadaný soubor symbolickým odkazem. Funguje pouze v kombinaci s --i možnost. |
--help | Zobrazte informace o použití. |
--i , --in-place [=SUFFIX] | Proveďte úpravy na místě přepsáním původního souboru. |
--posix | Zakažte všechna rozšíření POSIX sed pro zjednodušení psaní přenosných skriptů. |
--version | Zobrazit verzi sed běžící v systému. |
-E , -r , --regexp-extended | Používejte rozšířené regulární výrazy. |
-e <em>script</em> , --expression=<em>script</em> | Přidejte zadaný skript, který se má spustit s příkazy. |
-f <em>script-file</em> | Přidejte obsah zadaného souboru skriptu, který se má spustit s příkazy. |
-l <em>N</em> , --line-length=<em>N</em> | Definujte požadovanou délku zalamování řádku pro l příkaz (výchozí hodnota je 70). |
-n , --quiet , --silent | Zakázat tisk výstupu. |
-s , --separate | Zobrazujte zadané soubory jako samostatné, nikoli jako jeden souvislý dlouhý stream. |
--sandbox | Zakázat spouštění externích programů a pracovat pouze se vstupními soubory na příkazovém řádku. |
-u , --unbuffered | Minimalizujte vstupní a výstupní vyrovnávací paměť. |
-z , --null-data , --zero-terminated | Zobrazte vstup jako sadu řádků, kde každý končí nulou. |
Příklady systému Linux
Níže uvádíme deset běžně používaných sed
příkazy, příklady a syntaxe.
Pro tento tutoriál jsme vytvořili ukázkový soubor pod názvem foxinbox.tx t s následujícím obsahem:
Knox in box.
Fox in socks.
Knox on fox in socks in box.
Socks on Knox and Knox in box.
Fox in socks on box on Knox.
Všimněte si, že sed
neovlivní zdrojový soubor, pokud nedostanete pokyn. Místo toho příkaz zobrazí změny provedené daným příkazem ve svém výstupu.
Chcete-li přepsat původní soubor, použijte --i
možnost uložit změny. Takový postup se však nedoporučuje před testováním výstupu příkazu.
Případně uložit úpravy do jiného (nebo nového) souboru. Přesměrujte výstup přidáním > newfilename.txt
na konci příkazu.
Nahradit řetězec pomocí příkazu sed
Linux sed
příkaz se nejčastěji používá pro nahrazování textu. Vyhledá zadaný vzor v souboru a nahradí ho požadovaným řetězcem.
Chcete-li nahradit text pomocí sed
, použijte náhradní příkaz s
a oddělovače (ve většině případů lomítka - /
) pro oddělení textových polí.
Proto je syntaxe pro nahrazení textu:
sed 's/old_string/new_string/' filename.txt
Nahraďte old_string
s textem, který chcete nahradit, a new_string
s textem, na který jej chcete změnit.
Chcete-li například nahradit instance box
se slovem bin
, spustit:
sed 's/box/bin/' foxinbox.txt
Výstup zobrazuje text s nahrazenými slovy, jako na obrázku níže.
Nahradit všechny výskyty řetězce pomocí příkazu sed
Ve výchozím nastavení sed
pouze nahradí první výskyt zadaného řetězce v každém řádku. Vyhledá první výskyt zadaného slova na řádku, nahradí jej a přejde na další řádek.
S více výskyty slova box
ve stejném řádku příkaz nahradí pouze první.
Pokud máte více výskytů stejného slova na jednom řádku, přidejte g
příznak k příkazu, abyste je změnili všechny.
Příkaz pro nahrazení každého výskytu daného řetězce v textu je:
sed 's/old_string/new_string/g' filename.txt
Chcete-li nahradit slovo box
se slovem bin
v souboru foxinbox.txt pokaždé zadejte:
sed 's/box/bin/g' foxinbox.txt
Výše uvedený výstup ukazuje, že příkaz nahradil všechny výskyty slova box
.
Nahradit konkrétní výskyt v řádku pomocí příkazu sed
sed
umožňuje vybrat, který výskyt zadaného řetězce chcete nahradit v každém řádku. Chcete-li to provést, přidejte číselný příznak, například 1
, 2
atd.:
sed 's/old_string/new_string/#' filename.txt
Chcete-li například nahradit druhý výskyt slova box
v každém řádku textu slovo bin
, použijte tento příkaz:
sed 's/box/bin/2' foxinbox.txt
Příkaz vynechal tři výskyty slova, protože byly první v řadě a nahradily pouze ten na konci.
Vytisknout pouze řádky s náhradním textem
Ve výchozím nastavení je sed
příkaz vytiskne celý obsah souboru spolu s náhradním textem ve výstupu. Pokud máte hodně textu a chcete se zaměřit na řádky s aplikovanými změnami, přidejte do příkazu potřebné atributy.
Chcete-li vytisknout pouze řádky, které mají substituci za daných podmínek, použijte syntaxi:
sed -n 's/old_string/new_string/p' filename.txt
-n
volba zakáže automatický tisk, zatímco náhradní příkaz p
dává pokyn sed
vytisknout řádky, kde dochází k záměně.
Můžete přidat p
příkaz k jiným náhradním příkazům, jako v příkladu níže:
sed -n 's/box/bin/2p' foxinbox.txt
Příkaz nahradí druhý výskyt slova box
v řádku a vytiskne řádek, kde došlo ke změně. Na obrázku níže vidíte pouze jeden řádek s použitou substitucí.
Nahradit řetězec pomocí příkazu sed a ignorovat velikost písmen
Ve výchozím nastavení je sed
příkaz rozlišuje velká a malá písmena. Například následující obsah obsahuje slovo fox
s velkými a malými počátečními písmeny:
Knox in box.
Fox in socks.
Knox on fox in socks in box.
Socks on Knox and Knox in box.
Fox in socks on box on Knox.
Chcete-li nahradit všechny výskyty slova liška , nespouštějte obvyklý příkaz:
sed 's/fox/cow/' foxinbox.txt
Výsledek příkazu změní pouze výskyt slova fox
kde je to celé malé:
Chcete-li při nahrazování textu ignorovat velká a malá písmena, přidejte i
dílčí příkaz na konci příkazu:
sed 's/old_string/new_string/i' filename.txt
Proto příkaz pro změnu velkých a malých písmen slova liška ve výše uvedeném textu je:
sed 's/fox/cow/i' foxinbox.txt
Výstup ukazuje, že příkaz změnil všechny tři instance zadaného řetězce.
Nahradit řetězec v určitém řádku pomocí příkazu sed
sed
příkaz umožňuje nahradit řetězec v konkrétním řádku přidáním čísla řádku jako předpony do s
dílčí příkaz:
sed '# s/old_string/new_string/' filename.txt
Chcete-li tuto funkci otestovat na ukázkovém souboru foxinbox.txt soubor, nahraďte slovo socks
s sandals
pouze ve čtvrtém řádku (4
) textu pomocí příkazu:
sed '4 s/socks/sandals/' foxinbox.txt
Výstup ukazuje, že první výskyt slova socks
ve druhém řádku zůstává stejné, zatímco stejné slovo bylo nahrazeno výrazem sandals
ve čtvrtém řádku.
Nahradit řetězec pouze v určitém rozsahu řádků pomocí příkazu sed
Chcete-li nahradit více výskytů řetězce v rámci rozsahu řádků, ale nikoli celý text, zadejte rozsah, do kterého chcete sed
nahradit. Syntaxe je:
sed '#,# s/old_string/new_string/' filename.txt
Nahraďte první #
s počátečním číslem řádku a druhým #
s posledním číslem řádku, který chcete zahrnout.
Chcete-li například nahradit poslední dva výskyty slova ponožky v souboru foxinbox.txt (umístěné ve čtvrtém a šestém řádku) se slovem sandals
, spustíte:
sed '4,6 s/socks/sandals/' foxinbox.txt
Odstranit konkrétní řádek pomocí příkazu sed
Chcete-li odstranit řádek ze souboru s sed
použijte příkaz d
dílčí příkaz a syntaxi:
sed '#d' filename.txt
Zadejte číslo řádku, který chcete odstranit místo hash (#
) a spusťte příkaz.
Chcete-li například odstranit druhý řádek ze souboru foxinbox.txt soubor, zadejte:
sed '2d' foxinbox.txt
Odstranění čar v určitém rozsahu čar pomocí příkazu sed
Chcete-li odstranit více řádků v rozsahu řádků pomocí sed
postupujte podle syntaxe:
sed '#,#d' filename.txt
Nahraďte hash symboly začátkem a koncem rozsahu řádku. Například:
sed '2,4d' foxinbox.txt
Výše uvedený příkaz odstraní ze souboru řádky 2, 3 a 4.
Odstranit od konkrétního k poslednímu řádku pomocí příkazu sed
Chcete-li odstranit řádky od určitého čísla řádku po poslední řádek, použijte příkaz:
sed '#,$d' filename.txt
To znamená, že chcete odstranit vše od řádku 3 do konce foxinbox.txt , spusťte tento příkaz:
sed '3,$d' foxinbox.txt