unx sed editor
TRANSCRIPT
ÚvodÚvod● V první řadě je to “normální” textový filtr jako
● grep nebo awk
● V kostce: Po řádkách bere vstupní soubor, s některými provádí operace a pak je tiskne na výstup.
● Vychází z řádkového editoru ed
● Používá REGEX se starší notací, nejen díky tomu se může syntax jevit na první pohled jako naprostá změť 's/\[a\]*/\[a\]\{1\}/'
SED REGEX (shrnutí)SED REGEX (shrnutí)●^ za átek ádkyč ř● $ konec ádkyř● . jakýkoliv znak
● (char)* opakování znaku (0-n)x
● (char)? opakování znaku (0-1)x
● [abc] znak a OR b OR c
● [^abc] jakýkoliv znak krom (a OR b OR c)! dopln k ne negace!!ě ě● (char)\{m,n\} char minimáln m, maximáln n-krátě ě● (char)\{m,\} char alespo m-krátň● (char)\{,n\} char nejvýše n-krát
● (char)\{k\} char p esn k-krátř ě● \(re\) seskupení
● \n zp tná reference, n-tá skupina ?? otázka do davuě● re1 \| re2 re1 OR re2 (funguje jen u GNU sed)
Syntax (základní)Syntax (základní)● sed [-ne] 'ktereRadky prikaz' vstup {>vystup}
● KtereRadky určíme číslem nebo RE● Prikaz
● p vypíše řádkek na standartní výstup● n řádek se vypíše na výstup a je zpracováván další● d smaže řádek● w ukončí zpracování akt. řádku a zapíše jej do
souboru● s substituce (nejčastější použití sedu)
● s/co/čím/{příznaky}● -n potlačení výstupu, vypsány jen ty s p
Syntax (substituce)Syntax (substituce)● sed '/ktereRadky/ s/co/cim/{priznaky}' vstupniSoubor
● Priznaky● n přepíše n-tý výskyt co● g přepíše všechny výskyty co● p jestli zamění, vypíše co na STDOUT● w file jestli zamění, vypíše co do file
● Další syntax bude vysvětlena na příkladech
SED v příkladech ISED v příkladech I● sed '23 d' fileA
● # Vypíše vše kromě 23.řádku v fileA● sed -n '1-5 p' fileB
● # Vypíše řádky 1-5 z fileB● sed -n '/root/ p' /etc/passwd
● # Vypíše řádku superuživatele● sed -n 's/kocka/pes/gp' fileC
● # Vypíše jen ty řádky kde se vyskytuje “kocka” a nahradí je “pes” , bez příznaku g (global) nahradí jen první výskyt na řádce, s příznakem g všechny!
SED v příkladech IISED v příkladech II● sed -e 's/kocka/pes/g' -e 's/pes/slon/g' fileC
● # (-e = vykoná výraz), tam, kde je “kocka” nahradí “pes” a při druhém průchodu nahradí “pes” slovem “slon”
● sed -e '[email protected]@acme.net@g' fileD
● # oddělovače jsou rozpoznávány dynamicky● cat fileE && sed -e '/^radka.*jedna/s/radka/RADKA/' -e '/radka/d'
fileEradka 1 (jedna)
radka 2 (dva)
radka 3 (tri)
***
RADKA 1 (jedna)
SED v prikladech III (hotova reseni)SED v prikladech III (hotova reseni)● sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
● Vypíše řádky od konce: abcd -> dcba● echo 12345678 | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1 \2/;ta'
● # Za každými 3 čísly vytiskne mezeru, tedy: 12 345 678● sed -n '/regexp/{g;1!p;};h'
● # Vypíše řádku před tou, která obsahuje regexp● sed 's/\[/\\\[/g'
● # Před každou závorku [ přidá \, takže [ -> \[
Skripty v jazyku SEDSkripty v jazyku SED
● Pro složitější operace můžeme použít zápis do skriptu, do hlavičky musíme umístit
● #! /usr/bin/sed -f● Doporučuje se přípona .sed, závazné to není, spíše jen pro
přehlednost
Task (za 1 bod?)Task (za 1 bod?)● Vypište si rekurzivně všechny soubory (ls) ve svém
domovském adresáři (a ve všech podadresářích), u těch které mají přístupová práva 644 (rw-r—r--) a datum modifikace v roce 2005 změnte pomocí textového filtru sed uživatele/skupinu na root/root, velikosti souborů, popř. čísla inod vypisujte po třech.
● Zakázany: grep, awk!● Nápověda: (~hruzm1/napoveda)
● echo 12345678 | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1 \2/;ta'#12 345 678
SolvedSolved
● např.
ls -lia * | sed -ne '/-rw-r--r--/p' |
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1 \2/;ta' |
sed -ne '/.*2 005/s/..user../root/'
-e '/.*2 005/s/..group../root/'
-e 's/2 005/2005/p'
LiteraturaLiteratura● http://sed.sourceforge.net/sed1line_cz.html
● http://www-128.ibm.com/developerworks/linux/library/l-sed1.html
● http://www-128.ibm.com/developerworks/linux/library/l-sed2.html
● http://www-128.ibm.com/developerworks/linux/library/l-sed3.html
● http://www.oracle.com/technology/pub/articles/dulaney_sed.html
● http://www.suwald.com/linux-gnu/sed-howto.html
● http://pegasus.rutgers.edu/~elflord/unix/sed.html
● USENET (e.g. google groups): comp.unix.shell
The (Happy) End??The (Happy) End??
● A žili šťastně až do smrti..