/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
grep med <> løsning
Fra : Stig Sørensen


Dato : 03-12-04 18:10

Hejsa.

Jeg har en _meget_ lang tekst fil hvor jeg har brug for at finde linjer
der indeholder "time=X"

X = >50

Time skal være større end 50.
Har kigget i mansiderne og prøvet mig frem med noget ligende:

grep time=[>50] fil - men intet har virket.
Nogen der vil afslører den rigtige måde?

Pft.

 
 
Thorbjoern Ravn Ande~ (03-12-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 03-12-04 18:09

Stig Sørensen <no@mail.nospam> writes:

> Nogen der vil afslører den rigtige måde?

Det kan grep ikke, men awk og perl kan.

Noget i stil med (utestet)

#!/bin/perl

while(<>){
/time=(\d+)/;
print if ($1 > 50);
}



--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Peter Jensen (03-12-2004)
Kommentar
Fra : Peter Jensen


Dato : 03-12-04 18:47

Thorbjoern Ravn Andersen wrote:

>> Nogen der vil afslører den rigtige måde?
>
> Det kan grep ikke, men awk og perl kan.

Hvor der er en vilje er der en vej:

grep -E 'time=(5[1-9]|[6789][0-9]|[0-9]{3,})'

Men perl løsningen er selvfølgeligt langt mere elegant.

--
PeKaJe

You know you're using the computer too much when: the only light in your room
is that elite blue glow from all the blue leds in your box -- martinbishop

Stig Sørensen (03-12-2004)
Kommentar
Fra : Stig Sørensen


Dato : 03-12-04 19:35

On Fri, 03 Dec 2004 17:47:00 +0000, Peter Jensen wrote:

>
> Hvor der er en vilje er der en vej:
>
> grep -E 'time=(5[1-9]|[6789][0-9]|[0-9]{3,})'

Tak for det. Jeg kan desværre ikke overskue det.
Hvad skal ændres hvis den kun skal vise alt over 100?


Sune Vuorela (03-12-2004)
Kommentar
Fra : Sune Vuorela


Dato : 03-12-04 21:10

On 2004-12-03, Stig Sørensen <no@mail.nospam> wrote:
> On Fri, 03 Dec 2004 17:47:00 +0000, Peter Jensen wrote:
>
>>
>> Hvor der er en vilje er der en vej:
>>
>> grep -E 'time=(5[1-9]|[6789][0-9]|[0-9]{3,})'
>
> Tak for det. Jeg kan desværre ikke overskue det.
> Hvad skal ændres hvis den kun skal vise alt over 100?
Skal vi ikke skære den ud i pap, så?

'time=(5[1-9]|[6789][0-9]|[0-9]{3,})'

først har vi time= - det matcher på time.
(nogen|noget andet|noget tredje ....)
matcher på en af dem.

[nogle tegn eller et interval] matcher alle disse tegn.


5[1-9] det er tallet 5 efterfulgt af et tal der er fra 1-9 - det vil
sige tallene fra 51-59
[6789][0-9] matcher 60-99
[0-9]{3,} betyder mindst tre tal mellem 0 og 9.
Det vil sige 000-noget.
Da du ikke bruger foranstillede nuller, er alle dem der starter med 0
ligemeget.

Så det vil sige at for at nøjes med alt over 100, kan nøjes med:
'time=[0-9]{3,}'


Med forbehold for at min regexpviden ikke er fuldt udviklet.

--
Sune

Lasse Hillerøe Peter~ (04-12-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 04-12-04 10:26

In article <41b0a694$0$177$edfadb0f@dtext01.news.tele.dk>,
Peter Jensen <usenet@pekajemaps.homeip.net> wrote:

> Thorbjoern Ravn Andersen wrote:
>
> >> Nogen der vil afslører den rigtige måde?
> >
> > Det kan grep ikke, men awk og perl kan.
>
> Hvor der er en vilje er der en vej:
>
> grep -E 'time=(5[1-9]|[6789][0-9]|[0-9]{3,})'
^ ^^^^

Du antager her at der ikke er foranstillede nuller.
(ellers begynd med 0* udenfor parentes, og ret til [1-9][0-9]{2,})

> Men perl løsningen er selvfølgeligt langt mere elegant.

Det er diskutabelt. (Er regulære udtryk ikke i en eller anden
forstand "simplere" end aritmetik?)

Men hvis værdien der skulle sammenlignes var på fx dobbelt så mange
cifre så ville udtrykket nok blive en anelse rigeligt komplekst.

-Lasse

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408848
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste