GNU/Linux >> Znalost Linux >  >> Linux

Unix Sed Výukový program:Pokročilé příklady náhrady Sed

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

Linux
  1. Výuka Unix Sed:Jak provádět více příkazů Sed

  2. UNIX / Linux:10 příkladů příkazů Netstat

  3. 10 Příklady příkazů Xargs v Linuxu / UNIXu

  1. Bash HereDoc výukový program s příklady

  2. Příklady příkazů sed v Linuxu

  3. Substituce proměnné prostředí v sed

  1. Výukový program příkazu Linux/UNIX Awk s příklady

  2. Linux ln Command Tutorial pro začátečníky (5 příkladů)

  3. Linux nl Command Tutorial pro začátečníky (7 příkladů)