Další Předchozí Obsah

10. Neinteraktivní editor sed

Syntaxe příkazu je následující:

$ sed [-n] [-e] skript [-f soubor] [soubor] 

-n
Řádky se implicitně nekopírují na výstup.
-e skript
Skript k provedení.
-f soubor
Soubor se skriptem.
soubor
Editovaný soubor.
sed pracuje tak, že:

10.1 Instrukce

[adr1[,adr2]]/reg_výraz/instrukce
sed má několik instrukcí, které slouží k modifikaci výstupu.
d(delete)
Mazání - sed řádky nevypíše. Tak třeba nemusíte vypsat řádky, které začínají na #:
  sed /^#/d <soubory>
A tento program supluje /dev/null :)
  sed d
n(new)
Načte další řádek. Aktuální řádek zobrazí a nový zpracovává dalším příkazem

a(append)
Ta připojuje jeden nebo víc řádků k aktuálnímu.

i(insert)
funguje stejn2 jako a, ale připojuje před

c(change)
Tato intrukce funguje podobně jako a, ale načtený řádek zruší. Je možné použít dvě adresy. Potom se všechny řádky mezi nahradí jedním s novým příkazem.

s(substituce)
Její format je:
[adresa[,adresa]s/vzor/náhrada/[g][p][w jmeno]
Funkce potom nahradí vzor náhradou. Pokud nejsou uvedeny přepínače, nahrazuje se pouze první výskyt. Náhrada může obsahovat &, kam sed vloží vzor prepinace:
g
Budou se nahrazovat všechny výskyty vzoru
p
Budou se všechny řádky, kde se dělala substituce, posílat na stdout. Kdyz se bude dělat více substitucí budou se i víckrát psát.
w
stejně jako p, ale posílá výstup do souboru jméno

p(print)
Vypisuje řádky na standardní výstup. Ignoruje přepínač -n

w(write) file
Vypisuje řádky do souboru

r(read) jmeno
Přidá daný soubor k řádku.

l
Vytiskne předek a řídící znaky jako ^M apod. nahradí ascii kódem a nebo \ kombinacema (\n,\r atd.)

Řídící struktury

!
(not) Bude provádět instrukci na řádcích, které nebyly vybrány
{}
Mužete do nich dát více instrukcí, které budou prováděny při dané adrese.

10.2 Příklady

Chceme převést všechny soubory TIFF v aktuálním adresáři na JPEG:

for i in *.tif
do 
  convert "$i" "$(echo "$i" | sed 's/\.tif/.jpg/')"
done 

V dalším příkladu předpokládejme, že máme soubory obr0001.jpg, pes13.jpg apod. a budeme je chtít přejmenovat na obr_0001.jpg, pes_13.jpg:

for i in *.jpg
do 
  mv -i "$i" "$(echo "$i" | sed 's/\([a-z]\)\([0-9]\)/\1_\2/' )"
done

A teď něco složitějšího: Předpokládejme, že máme soubory obr1.jpg až obr2000.jpg, sken_01.jpg až sken_100.jpg a chceme je přejmenovat tak, aby číselný údaj byl vždy čtyřmístný.

for i in *.jpg
do 
  mv -i "$i" "$(echo "$i" | sed ':1;s/\([^0-9]\)\([0-9]..[^0-9]\)/\10\2/;t1' )"
done

Převod z unix na dos formát textových souborů.

$ sed  "$ !s/$/^M/$ s/$/^Z/"

a naopak:

$ sed "s/^M$//$ /^Z$//"


Další Předchozí Obsah