sed a \n

Alexandr Malusek malusek na hroch.ujf.cas.cz
Středa Prosinec 20 18:12:39 CET 2000


azeleny na csas.cz writes:

> co to zkusit takto:
> cat X | sed -f script.sed
> 
> kde script.sed bude:
> =============
> s/\
> //g'
> =============
> 
> Pod windowsama v GNU sed32 neco takoveho pouzivam.

sed-u je nekolik variant. V klasickem sed-u by vyse uvedena konstrukce
pod Unixem fungovat nemela, v jinych sedech to fungovat muze. V
MS-Windows se deji podivne veci, takze funkcnost vyse uvedeno prikladu
bude spis vedlejsim efektem cehosi (konverze koncu radek, ...) nez
korektnim chovanim.

Knihu o sed-u od O'Reilly ted u sebe nemam, takze nasledujici popis je
treba brat s velkou rezervou.

sed napred _celou radku_ nacte do sveho pattern space (= vstupni
bafr), a teprve pak v tomto pattern space aplikuje napr. substituci
prikazem "s". Ukoncovac radky, znak "\n", se ale do pattern space
neuklada, takze ho neni mozne substituovat!

A i kdyz ho tam dostanete, napr. prikazem G, tak si nepomuzete,
protoze pattern space je pri vystupu automaticky doplnen o '\n' na
konci.

Priklady:
$ cat f1
line 1
line 2
line 3

$ sed -n -e l < f1
line 1$             # Takto vypada pattern space po nacteni radky 1
line 2$             #  ...                                        2
line 3$             #  ...                                        3

$ sed -n -e G -e l < f1
line 1\n$           # prikaz "G" pridal do pattern space znak '\n'
line 2\n$
line 3\n$

$ sed -n -e G -e 's/\n/XYZ/g' -e l < f1
line 1XYZ$          # prikaz "s" nahradil '\n' v pattern space za "XYZ"
line 2XYZ$
line 3XYZ$

$ sed -n -e N -e N -e l < f1
line 1\nline 2\nline 3$  # Radky 1-3 byly spojeny v pattern space

$ sed -n -e N -e N -e 's/\n//g' -e l < f1
line 1line 2line 3$      # Znak '\n' byl z pattern space odstranen

> On totiz za tm \ nacte znak odradkovani. Taky jsem se _DLOUHO_ moril s
> marnym pokusem \n ...

V pripade sed-u je lepsi si napred precist teorii. Jinak jen ztracite
cas.

> > > narazil jsem na jednu drobnost - jak se rekne sed-u, aby vyhodil ze
> > > vstupu znaky 'konec radku'?

Pro tento ucel je asi nejlepsi tr. Perl je dalsi varianta. Jeho
koncepce zpracovani vstupu je pruhlednejsi. Pattern space a hold space
radu lidi silne mate.

> > > cat x |sed 's/\n//g'

Zase ten nadbytecny cat ... ;-)

--
A. Malusek  (malusek na ujf.cas.cz)
UJF AV CR


Další informace o konferenci Linux