[FreeBSD] sed

Gabor Zahemszky ZGabor at CoDe.hu
2001. Aug. 16., Cs, 11:25:29 CEST


Szia!

On Thu, Aug 16, 2001 at 10:44:27AM +0200, Nohl Attila Rajmund wrote:
> IMHO ne a sed manualjat olvasgasd, hanem az awk-et :-) A sed csak
> sorokra megy, eleg szenvedes lesz, ha elozo soroktol fuggo dolgokat
> akarsz csinalni. awk-ban valami ilyesmire lesz szukseged:

Hm. Egy pelda arra, hogy milyen jo is az, ha a valaki a problemajat nemi
peldaval fuszerezi, lathato modon totalisan ket kulonbozo dolgot ertettunk
alatta.  NAR megoldasa kicsit bobeszedu, de megfelel az elvarasoknak.

> BEGIN {
>         JO_HELY=0;
>         }

Az egesz BEGIN redundans :-)

> /ez itt a kezdet/ {
>         JO_HELY=1;
>         next;
>         }
> /ez itt a veg/ {
>         JO_HELY=0;
>         next;
>         }

>         {
>         if (0==JO_HELY) {
>                 next;
>                 }
>         ...
>         }

Miert az ellenkezojet teszteled, mint ami Neked kell?  Helyette egyertelmubb:
JO_HELY == 1 {
		...
		}

> A ... helyere johet a te kodod.
> 

(Es mivel csak kiiratni akar a feladat szerint, az egesz { ... } akcio
elhagyhato :-), eleg a minta resz.)

Es csak azert, hogy lathato legyen, nem olyan eszement ugyanez sed-ben
(speciel elofelteves, hogy csak egy kezdet es egy vegzet van:)

pipe eleje |
sed -e '1,/ez itt a kezdet/d' -e '/ez itt a vegzet/,$d' |
pipe vege

Es ha emlekeim nem csalnak, az elozo levelben emlegetett sed & awk konyv
szinte szorol szora ezt a feladatot vezeti le sedben, abban az altalanosabb
esetben, ha tobb kozrezart szoveg van.  Amire egy nagyon egyszeru (csak
nem tul elegans) megoldas a kovetkezo:

pipe eleje |
sed -n -e '/ez itt a kezdet/,/ez itt a vegzet/p' |
sed -e '/ez itt a kezdet/d' -e '/ez itt a vegzet/d' |
pipe vege

Amiben ket sed is van (nekem nem sikerult eggyel megoldanom), es ebbol az
elsonel kell a ``-n'', a masodiknal meg nem

No pa, shell/sed/awk programozoi tanfolyamomat befejeztem, meg meg kene irnom
egy 4-5 oldalas eloadas anyagat a ``BSD vilaga'' cimu targykorben.

ZGabor at CoDe dot HU

-- 
#!/bin/ksh
Z='21N16I25C25E30, 40M30E33E25T15U!' ;IFS=' ABCDEFGHIJKLMNOPQRSTUVWXYZ ';set $Z ;for i { [[ $i = ? ]]&&print $i&&break;[[ $i = ??? ]]&&j=$i&&i=${i%?};typeset -i40 i=8#$i;print -n ${i#???};[[ "$j" = ??? ]]&&print -n "${j#??} "&&j=;typeset +i i;};IFS=' 0123456789 ';set $Z;X=;for i { [[ $i = , ]]&&i=2;[[ $i = ?? ]]||typeset -l i;X="$X $i";typeset +l i;};print "$X"



További információk a(z) BSD levelezőlistáról