Uzitecne jednoradkove scripty pro SED

1) MEZERY V SOUBORU:

  • za každý řádek přidá volný řádek
sed G
  • za každý řádek přidá volný řádek a navíc zajistí, že nikde nebudou dva volné řádky za sebou
 sed '/^$/d;G'
  • za každý řádek přidá dva volné řádky
 sed 'G;G'
  • odstraní každý druhý řádek
 sed 'n;d'
  • vloží prázdný řádek před každý řádek, který obsahuje „regex“
 sed '/regex/{x;p;x;}'
  • vloží prázdný řádek za každý řádek, který obsahuje „regex“
 sed '/regex/G'
  • vloží prázdný řádek před i za každý řádek, který obsahuje „regex“
 sed '/regex/{x;p;x;G;}'

2)ČISLOVÁNÍ:

  • očísluje všechny řádky v souboru (zarovnání vlevo). Použití tabulátorů

(viz. poznámka o \t níže) zajistí odsazení.

 sed = filename | sed 'N;s/\n/\t/'
  • očísluje řádky v souboru (čísla vlevo, zarovnání vpravo)
 sed = filename | sed 'N; s/^/     /; s/ *\(.\{6,\}\)\n/\1  /'
  • očísluje řádky v souboru jen pokud řádek není prázdný
 sed '/./=' filename | sed '/./N; s/\n/ /'

3) PŘEVODY TEXTU A NAHRAZOVÁNÍ:

  • V UNIXu: převede DOSové nové řádky (CR/LF) na Unixový formát.
 sed 's/.$//'               # předpokladá že řádky konči CR/LF
 sed 's/^M$//'              # v bash a v tcsh stiskni Ctrl-V, poté Ctrl-M
 sed 's/\x0D$//'            # pracuje s ssed, gsed 3.02.80 a vyšší
  • V UNIXu: převede Unixové nové řádky (LF) na DOSový formát.
 sed "s/$/`echo -e \\\r`/"            # příkazová řádka v ksh
 sed 's/$'"/`echo \\\r`/"             # příkazová řádka v bash
 sed "s/$/`echo \\\r`/"               # příkazová řádka v zsh
 sed 's/$/\r/'                        # gsed 3.02.80 a vyšší
  • V DOSu: převede Unixové nové řádky (LF) na DOSový formát.
 sed "s/$//"                          # 1. způsob
 sed -n p                             # 2. způsob
  • smaže prázdné místo (mezery, tabulátory) na začátku každé řádky zarovná celý text vlevo
 sed 's/^[ \t]*//'                    # viz. poznámka '\t' níže
  • smaže prázdné místo (mezery, tabulátory) na konci řádky
 sed 's/[ \t]*$//'                    # viz. poznámka '\t' níže
  • smaže prázdné místo (mezery, tabulátory) ze začátku i z konce
 sed 's/^[ \t]*//;s/[ \t]*$//'
  • vloží 5 mezer na začátek každé řádky
 sed 's/^/     /'
  • zarovná celý text vpravo, na celkovou šířku 79 znaků ve sloupci
 sed -e :a -e 's/^.\{1,78\}$/ &/;ta'  # zarovná na 78 znaků + 1 mezera

* vycentruje celý text do středu 79 znakového sloupce. První způsob počítá mezery na začátku a na konci jako normální znak, druhým jsou mezery na začátku odstraněny.

 sed  -e :a -e 's/^.\{1,77\}$/ & /;ta'                     # 1. způsob
 sed  -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'  # 2. způsob
  • prohodí (najde a nahradí) „foo“ a „bar“ na každé řádce
 sed 's/foo/bar/'             # nahradí jen první výskyt na řádce
 sed 's/foo/bar/4'            # nahradí jen čtvrtý výskyt na řádce
 sed 's/foo/bar/g'            # nahradí všechny výskyty na řádce
 sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # nahradí předposlední výskyt
 sed 's/\(.*\)foo/\1bar/'            # nahradí poslední výskyt
  • nahradí „foo“ výrazem „bar“ JEN na řádkách, které obsahují „baz“
 sed '/baz/s/foo/bar/g'
  • nahradí „foo“ vy$razem „bar“ JEN na řádkách, které neobsahují „baz“
 sed '/baz/!s/foo/bar/g'
  • nahradí „scarlet“, nebo „ruby“, nebo „puce“ výrazem „red“
 sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'   # větsina sedů
 gsed 's/scarlet\|ruby\|puce/red/g'                # pouze GNU sed
  • vypíše soubor od konce (namísto „tac“)
 sed '1!G;h;$!d'               # 1. způsob
 sed -n '1!G;h;$p'             # 2. způsob
  • vypíše řádky od konce (namísto „rev“)
 sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
  • spojí každé dvě řádky (jako „paste“)
 sed '$!N;s/\n/ /'
  • pokud řádka končí zpětným lomítkem připojí následující řádku
 sed -e :a -e '/\\$/N; s/\\\n//; ta'
  • pokud řádka začíná rovnítkem připojí ji k předchozí řádce a nahradí “=“ mezerou
 sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
  • přidá čárky k číslům - změní „1234567“ na „1,234,567“
 gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta'                     # GNU sed
 sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'  # ostatní sedy
  • přidá mezery k čislům - změní „1234567“ na „1 234 567“
 gsed ':a;s/\B[0-9]\{3\}\>/ &/;ta'                     # GNU sed
 sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1 \2/;ta'  # ostatní sedy
 
  • přidá čárku k čislům s desetinnou čárkou a znaménkem mínus (GNU sed)
 gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'
  • přidá prázdnou řádku po každé páté řádce (po 5, 10, atd.)
 gsed '0~5G'                  # pouze GNU sed
 sed 'n;n;n;n;G;'             # ostatní sedy

4) VYPSÁNÍ URČITÝCH ŘÁDEK:

  • vypíše prvních 10 řádek v souboru (namísto „head -n 10“)
 sed 10q
  • vypíše první řádku souboru (namísto „head -n 1“
 sed q
  • vypíše posledních 10 řádek v souboru (namísto „tail“)
 sed -e :a -e '$q;N;11,$D;ba'
  • vypíše poslední 2 řádky souboru (namísto „tail -n 2“)
 sed '$!N;$!D'
  • vypíše poslední řádku souboru (namísto „tail -n 1“)
 sed '$!d'                    # 1. způsob
 sed -n '$p'                  # 2. způsob
  • vypíše předposlední řádku v souboru
 sed -e '$!{h;d;}' -e x             # pro 1-řádkový soubor vypíše prázdnou řádku
 sed -e '1{$q;}' -e '$!{h;d;}' -e x # pro 1-řádkový soubor vypíše řádku
 sed -e '1{$d;}' -e '$!{h;d;}' -e x # pro 1-řádkový soubor nevypíše nic
	
* vypíše pouze řádky, které obsahují "regexp" (namísto "grep")
 sed -n '/regexp/p'           # 1. způsob
 sed '/regexp/!d'             # 2. způsob
  • vypíše pouze řádky, které NEobsahují „regexp“ (namísto „grep -v“)
 sed -n '/regexp/!p'          # 1. způsob, viz. zadání
 sed '/regexp/d'              # 2. způsob, kratší kod
  • vytiskne řádku před tou, která obsahuje „regexp“
 sed -n '/regexp/{g;1!p;};h'
  • vytiskne řádku po té, co obsahuje „regexp“
 sed -n '/regexp/{n;p;}'
  • vytiskne číslo řádky obsahující „regexp“, řádku před ní, jí samotnou a řádku po ní (podobně „grep -A1 -B1“)
 sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
  • grep pro AAA, BBB a CCC (v libovolném pořadí)
 sed '/AAA/!d; /BBB/!d; /CCC/!d'
  • grep pro AAA, BBB a CCC (v tomto pořadí)
 sed '/AAA.*BBB.*CCC/!d'
  • grep pro AAA, nebo BBB, nebo CCC (namísto „egrep“)
 sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d    # větsina sedů
 gsed '/AAA\|BBB\|CCC/!d'                        # pouze GNU sed
  • vypíše odstavec obsahující AAA (odstavce jsou odděleny prázdnými řádkami)
  • HHsed verze 1.5 musí mit 'G;' po 'x;' v následujících třech skriptech
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
  • vypíše odstavec obsahující AAA, BBB a CCC (v libovolném pořadí)
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
  • vypíše odstavec obsahující AAA, nebo BBB, nebo CCC
 sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
 gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'         # pouze GNU sed
  • vypíše jen řádky s 65 znaky, nebo víc
 sed -n '/^.\{65\}/p'
  • vypíše jen řádky s méně než 65 znaky
 sed -n '/^.\{65\}/!p'        # 1. způsob, viz. zadání
 sed '/^.\{65\}/d'            # 2. způsob, kratší zápis
  • vypíše soubor od „regexp“ do konce
 sed -n '/regexp/,$p'
  • vypíše část souboru dle čísla řádek (řádky 8-12, včetně)
 sed -n '8,12p'               # 1. způsob
 sed '8,12!d'                 # 2. způsob
  • vypíše řádku číslo 52
 sed -n '52p'                 # 1. způsob
 sed '52!d'                   # 2. způsob
 sed '52q;d'                  # 3. způsob, rychlé i na velkých souborech
  • počínaje 3-tí, vypíše každou sedmou řádku
 gsed -n '3~7p'               # pouze GNU sed
 sed -n '3,${p;n;n;n;n;n;n;}' # ostatní sedy
  • vypíše část souboru mezi dvěma výrazy (včetně)
 sed -n '/Iowa/,/Montana/p'             # pozor na VELKÁ a malá písmena

5) MAZÁNÍ VYBRANÝCH ŘÁDEK:

  • vypíše vše AŽ na oblast mezi „Iowa“ a „Montana“
 sed '/Iowa/,/Montana/d'
  • smaže duplicitní, po sobě jdoucí řádky ze souboru (namísto „uniq“).
  • První řádka v řade duplicitních zůstane, ostatní jsou smazány.
 sed '$!N; /^\(.*\)\n\1$/!P; D'
  • smaže duplicitní řádky nejdoucí po sobě. Pozor na přetečení bufferu, jinak užijte GNU sed.
 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
  • smaže všechny řádky výskytující se jednou (namísto „uniq -d“) (soubor musí být seřazen)
 sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'
  • smaže prvních 10 řádek v souboru
 sed '1,10d'
  • smaže poslední řádku
 sed '$d'
  • smaže poslední dvě řádky
 sed 'N;$!P;$!D;$d'
  • smaže posledních deset řádek
 sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # 1. způsob
 sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # 2. způsob
  • smaže každou osmou řádku
 gsed '0~8d'                           # pouze GNU sed
 sed 'n;n;n;n;n;n;n;d;'                # ostatní sedy
  • smaže řádky obsahující „pattern“
 sed '/pattern/d'
  • smaže všechny prázdné řádky ze souboru (jako „grep '.' ““)
 sed '/^$/d'                           # 1. způsob
 sed '/./!d'                           # 2. způsob
  • pokud je víc prázdných řádek po sobě, smaže je až na první smaže prázdné řádky ze začátku souboru (namísto „cat -s“)
 sed '/./,/^$/!d'          # 1. způsob, nenechá mezeru na začátku, 1 u EOF
 sed '/^$/N;/\n$/D'        # 2. způsob, nechá 1 mezeru na začátku, 0 u EOF
 
  • smaže všechny po sobě jdoucí prázdné řádky až na první dvě
 sed '/^$/N;/\n$/N;//D'
  • smaže prázdné řádky na začátku souboru
 sed '/./,$!d'
  • smaže všechny prázdné řádky na konci souboru
 sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'  # běží na všech sedech
 sed -e :a -e '/^\n*$/N;/\n$/ba'        # taktéž, až na gsed 3.02.*<
  • smaže poslední řádku všech odstavců
 sed -n '/^$/{p;h;};/./{x;/./p;}'

Personal Tools