Sed: Porovnání verzí

Smazaný obsah Přidaný obsah
Bez shrnutí editace
Řádek 5:
== Použití ==
 
Programovací jazyk pro sed vychází z editoru '''[[ ed ]]''', ovšem na rozdíl od něj neprovádí změnu přímo v editovaném souboru, ale ve výpisu. Takže dokud výstup není přesměrován do souboru k žádné změmězměně nedojde.
 
'''Pozn.''': Pokud přesměrujete výstup do téhož souboru co z něj data načítáte, tak je výsledkem prázdný soubor!
Řádek 13:
=== Zdroj dat ===
 
Zdrojem zpracovávaných dat může být jednak soubor, nebo také proud dat (např. předávaný [[ Bash:#Roury (pípy, pipelines), také zřetězení | rourou ]]) Podobně jako [[ awk ]], '''sed''' analyzuje řádky ze vstupního proudu dat, které pak zpracovává podle nastavených příkazů. Řádky, které se mají zpracovat lze určit také pomocí vzorku, nebo rozsahem podle čísla řádku. Pokud není tzv. "adresa" uvedena, zpracovává sed postupně všechny načítané řádky.
 
=== Syntaxe a oddělovače ===
 
Mezi nejčastěji používané příkazy patří nahrazování řetězců (substituce), takže tento příkaz použiju pro demonstraci i v následujících ukázkách.
 
;Příklad použití na příkazovém řádku
 
<pre>
user@stroj:~/$ sed '1,20 s/vzorek/jiný vzorek/g' soubor_dat.txt
</pre>
 
;Slovy ''Přečti soubor soubor_dat.txt a u prvních dvaceti řádků zaměň všechny řetězce "vzorek" za řetězec "jiný vzorek" ostatní řádky nech tak jak jsou.''
 
;Rozbor příkazu:
:1,20 - vymezení zpracovávané oblasti
:s - příkaz pro substituci, který očekává tři parametry
:vzorek - co nahradit
:jiný vzorek - čím nahradit
:g - parametr pro globální nahrazení, není-li uveden, nahradí se pouze první výskyt vzorku
:/ - oddělovač
 
Jako oddělovač se nečastěji používá znak "/" ale lze také použít "_" nebo "|". Zlepšuje to čitelnost zvláště v takových případech, kdy by byl stejný znak použitý i u zpracovávaných vzorků. V takových případech je nutno ošetřit tyto znaky zpětným lomítkem "\" nicméně posuďte sami jaká je přehlednost takového zápisu viz následující příklad:
 
;Příklad
<pre>
user@stroj:~/$ sed 's_/usr/share/qt3_/usr/share/qt4_' soubor_dat.txt
user@stroj:~/$ sed 's|/usr/share/qt3|/usr/share/qt4|' soubor_dat.txt
user@stroj:~/$ sed 's/\/usr\/share\/qt3/\/usr\/share\/qt4/' soubor_dat.txt
</pre>
 
'''Poznámka:''' Jak jste si možná povšimli, příkaz v příkladech je vždy uzavřen do jednoduchých uvozovek, je tomu tak proto, aby se zamezilo nežádoucí interpretaci znaků na příkazovém řádku.
 
=== Vícenásobné zpracování vstupu ===
 
Většina lidí si vystačí s jednoduchým nahrazením a málokdy používá složitější konstrukce příkazů. V jejich skriptech pak lze nalézt podobné konstrukce
 
;Špatný příklad
 
<pre>
user@stroj:~/$ sed 's/START/start/' soubor_dat.txt | sed 's/KONEC/konec/' soubor_dat.txt
user@stroj:~/$ cat soubor_dat.txt | sed 's/START/start/' | sed 's/KONEC/konec/' soubor_dat.txt
</pre>
 
Chyba spočívá v tom, že pro zpracování proudu dat jsou v prvním příkladu spuštěny dva procesy a v tom druhém dokonce tři! Přičemž stejného výsledku lze dosáhnout jedním procesem a seskupením příkazů buď použitím parametru "-e", nebo jejich spojením do jedněch uvozovek a oddělením pomocí středníku.
 
;Správný příklad
 
<pre>
user@stroj:~/$ sed -e 's/START/start/' -e 's/KONEC/konec/' soubor_dat.txt
user@stroj:~/$ sed 's/START/start/;s/KONEC/konec/' soubor_dat.txt
</pre>
 
===Skripty===
 
 
V případě složitějších konstrukcí je výhodnější než na příkazový řádek zapsat soubor příkazů do zvláštního souboru. V něm se každý příkaz píše na nový řádek, tudíž je není nutné oddělovat středníky.
 
;Příklad - výpis souboru soubor_prikazu_pro_sed
<pre>
 
</pre>
 
;Použití
 
<pre>
user@stroj:~/$ sed -f soubor_prikazu_pro_sed soubor_dat.txt
</pre>
 
Další možností je napsat takový soubor příkazů rovnou jako spustitelný skript (tj. je třeba mu potom nastavit právo pro spouštění - x) viz následující výpis souboru <code>nahrada.sed</code>
 
<pre>
#!/bin/sed -f
</pre>
 
Ten pak lze použít takto:
 
<pre>
user@stroj:~/$ ./nahrada soubor_dat.txt
</pre>
 
 
;Poznámka : V sadách příkazů pro sed lze používat také komentáře. Podobně jako [[ bash ]] považuje '''sed''' za komentář všechny řádky, které značínají znakem "#"
 
Tabulka příkazů:
 
nahrazení řetězce (substituce)
s
3 parametry
 
přidání (append)
a
1 parametr
 
odstranění (delete)
d
1 parametr
 
vložení (insert)
i
1 parametr
 
nahrazení řádku (change)
c
1 parametr
 
Přidání čísla řádku
=
žádný parametr
 
Přidání nového řádku
N
žádný parametr
 
Transformace
y
3 parametry
 
== Příklady ==
 
=== Sed jako alternativa head a tail ===
 
 
=== Sed jako alternativa ke grep ===
 
 
[[Kategorie:Linux]]