[linux] Re: Twee problemen met sed

Kees Theunissen theuniss op rijnh.nl
Wo Mrt 8 20:21:25 CET 2006


On Wed, 8 Mar 2006, Cecil Westerhof wrote:

>Ik heb twee problemen met sed. Volgens mij zouden de reguliere expressies
>       "\.? "
>en
>       "\.\{0,1\}
>hetzelfde moeten betekenen. Echter de tweede werkt wel en de eerste
>niet. Doe ik iets fout?


Probeer het eens met een backslash escaped vraagteken "\?".
Waarom? Vage reden, om dezelfde reden dat je in  "\.\{0,1\}" de
accolades backslash escaped.

Het werkt bij mij wel:

kees op pcict9:~$ echo "aapnoot aap.noot" |sed -e 's/p\.?n/p n/g'
aapnoot aap.noot
kees op pcict9:~$ echo "aapnoot aap.noot" |sed -e 's/p\.\?n/p n/g'
aap noot aap noot
kees op pcict9:~$ echo "aapnoot aap.noot" |sed -e 's/p\.\{0,1\}n/p n/g'
aap noot aap noot


Speel ook eens met de -r optie van sed.

       -r, --regexp-extended

              use extended regular expressions in the script.


Je kunt dan een hoop gedoe met backslashes vermijden:

kees op pcict9:~$ echo "aapnoot aap.noot" |sed -re 's/p\.?n/p n/g'
aap noot aap noot
kees op pcict9:~$ echo "aapnoot aap.noot" |sed -re 's/p\.{0,1}n/p n/g'
aap noot aap noot


Met backslashes werkt het dan niet meer:

kees op pcict9:~$ echo "aapnoot aap.noot" |sed -re 's/p\.\?n/p n/g'
aapnoot aap.noot
kees op pcict9:~$ echo "aapnoot aap.noot" |sed -re 's/p\.\{0,1\}n/p n/g'
aapnoot aap.noot



>
>Daarnaast gebruik ik de volgende expressies:
>       -e "/^[[:alpha:]]\{3\}  [[:digit:]]
>[[:digit:]]\{2\}:[[:digit:]]\{2\}:[[:digit:]]\{2\} /s///" \
>en
>       -e "/^[[:alpha:]]\{3\} [[:digit:]]\{2\}
>[[:digit:]]\{2\}:[[:digit:]]\{2\}:[[:digit:]]\{2\} /s///" \
>
>Het verschil is dat in het ene geval op de vijfde positie een spatie
>staat en in het andere geval een cijfer.
>In dit specifieke geval kan dit worden opgelost door de volgende
>expressie:
>       -e "/^[[:alpha:]]\{3\} \( \|[[:digit:]]\)[[:digit:]]
>[[:digit:]]\{2\}:[[:digit:]]\{2\}:[[:digit:]]\{2\} /s///"
>Echter op het moment dat aan weerszijden van de '|' meer als een
>karakter staat, dan krijg ik dit niet werkend. Hoe zou ik dit voor
>elkaar moeten krijgen?


Kan je hier duidelijker zijn:
-- Exact voorbeeld van een expressie met "meer als een" karakter aan weerszijde
   van de '|'.
-- Een voorbeeld van een string die volgens jou dan zou moeten matchen, maar dat
   niet doet.


Als ik een snelle test doe met een simpele expressie die drie tekens heeft
aan weerszijde van de '|' dan werkt dat gewoon:

kees op pcict9:~$ echo "123 456" |sed -e 's/\(123\|456\)/replaced/g'
replaced replaced
kees op pcict9:~$ echo "123 456" |sed -re 's/(123|456)/replaced/g'
replaced replaced



Groeten,

Kees.

-- 
Kees Theunissen
F.O.M.-Instituut voor Plasmafysica "Rijnhuizen", Nieuwegein
E-mail: theuniss op rijnh.nl,     Tel: 030-6096724,     Fax: 030-6031204



More information about the Linux mailing list