Tento článek je součástí probíhající série Unix Sed Tips and Tricks.
V našich předchozích článcích o sed jsme se naučili – tisk sed, smazání sed, nahrazení sed , zápis souboru sed a více příkazů sed.
V tomto článku se podíváme na některá zajímavá řešení pomocí náhradního příkazu „s“ v sed s několika praktickými příklady.
I. Sed Substitution Delimiter
Jak jsme diskutovali v našem předchozím příspěvku, můžeme použít různé oddělovače, jako je @ % |; :v zástupném příkazu sed.
Nejprve vytvořte soubor path.txt, který bude použit ve všech níže uvedených příkladech.
$ cat path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
Příklad 1 – sed @ delimiter:Nahraďte /opt/omni/lbin za /opt/tools/bin
Když nahradíte název cesty, který má '/', můžete místo '/' použít @ jako oddělovač. V níže uvedeném příkladu sed na posledním řádku vstupního souboru byl /opt/omni/lbin změněn na /opt/tools/bin.
$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
Příklad 2 – sed / oddělovač:Nahraďte /opt/omni/lbin za /opt/tools/bin
Když byste měli použít „/“ v náhražce související s názvem cesty, musíte v substitučních datech escapovat „/“, jak je uvedeno níže. V tomto příkladu sed byl v části REGEXP a REPLACEMENT escapován oddělovač „/“.
$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
II. Sed ‘&’ Get Matched String
Přesná část vstupního řádku, na které se regulární výraz shoduje, je reprezentována znakem &, který pak lze použít v náhradní části.
Příklad 1 – sed &Použití:Nahraďte /usr/bin/ za /usr/bin/local
$ sed 's@/usr/bin@&/local@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin/local:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin/local:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
Ve výše uvedeném příkladu „&“ v náhradní části nahradí /usr/bin, což je odpovídající vzor, a přidá jej /local. Takže ve výstupu bude veškerý výskyt /usr/bin nahrazen /usr/bin/local
Příklad 2 – sed &Použití:Porovnejte celý řádek
&nahradí vše, co odpovídá danému REGEXP.
$ sed 's@^.*$@<<<&>>>@g' path.txt <<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>> <<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>> <<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>
Ve výše uvedeném příkladu má regulární výraz „^.*$“, který odpovídá celému řádku. Náhradní část <<<&>>> zapíše celý řádek s <<>> na začátku a na konci řádku.
III. Seskupování a zpětné odkazy v Sed
Seskupování lze v sed použít jako normální regulární výraz. Skupina se otevírá pomocí „\(“ a uzavírá se „\)“. Seskupování lze použít v kombinaci se zpětným odkazováním.
Zpětný odkaz je opětovné použití části regulárního výrazu vybraného seskupením. Zpětné odkazy v sed lze použít jak v regulárním výrazu, tak v náhradní části náhradního příkazu.
Příklad 1:Získejte pouze první cestu v každém řádku
$ sed 's/\(\/[^:]*\).*/\1/g' path.txt /usr/kbos/bin /usr/local/sbin /opt/omni/lbin
Ve výše uvedeném příkladu \(\/[^:]*\) odpovídá cestě dostupné před first :coming. \1 nahradí první odpovídající skupinu.
Příklad 2:Vícenásobné seskupení
V souboru path.txt změňte pořadí polí na posledním řádku souboru.
$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin: /root/bin:/opt/omni/sbin:/opt/omni/lbin
Ve výše uvedeném příkazu $ specifikuje substituci pouze pro poslední řádek. Výstup ukazuje, že pořadí hodnot cesty v posledním řádku bylo obráceno.
Příklad 3:Získejte seznam uživatelských jmen v souboru /etc/passwd
Tento příklad sed zobrazuje pouze první pole ze souboru /etc/passwd.
$sed 's/\([^:]*\).*/\1/' /etc/passwd root bin daemon adm lp sync shutdown
Příklad 4:Udělejte závorku pro první znak každého slova
Tento příklad sed vytiskne první znak každého slova v závorce.
$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g' (W)elcome (T)o (T)he (G)eek (S)tuff
Příklad 5:Uveďte jednoduché číslo.
Vytvořme soubor s názvem čísla, který má seznam čísel. Níže uvedený příklad příkazu sed se používá pro potvrzení čísel do tisíců.
$ cat numbers 1234 12121 3434 123 $sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers 1,234 12,121 3,434 123