|
| Klippe tekst imellem to tegn? Fra : Steen Suder, privat |
Dato : 20-07-04 17:15 |
|
Jeg har noget MRTG på en Linuxboks og jeg vil gerne klippe dagsgrafen
inkl. statistikken (tallene nedenunder) ud til brug i en anden side.
Dybest set skal jeg have alt, der står imellem 1. <HR> og 2. <HR>.
Jeg kan ikke være helt sikker på at de står på samme linier hver gang,
hvorfor min første indskydelse med at bruge head og tail ikke er egnet.
Hvad er den mest elegante måde at hive teksten ud på?
--
Steen Suder
Prøv at forestille dig, at du er en anden, og læs så din artikel igennem
inden du sender den. Alle har interesse i, at du staver og formulerer
dig, så godt du kan. På den måde forstås det lettere, hvad du skriver.
| |
Peter Makholm (20-07-2004)
| Kommentar Fra : Peter Makholm |
Dato : 20-07-04 17:26 |
|
"Steen Suder, privat" <sfs_news_spam@suder.dk> writes:
> Dybest set skal jeg have alt, der står imellem 1. <HR> og 2. <HR>.
> Jeg kan ikke være helt sikker på at de står på samme linier hver gang,
> hvorfor min første indskydelse med at bruge head og tail ikke er egnet.
Står <HR> på deres egne linjer?
Så kan du lave noget perl:
.... | perl -ne 'print if /<HR>/ ... /<HR>/' | ...
Du får dog linjerne med <HR> med.
--
Peter Makholm | I have no caps-lock but I must scream...
peter@makholm.net | -- Greg
http://hacking.dk |
| |
Steen Suder, privat (20-07-2004)
| Kommentar Fra : Steen Suder, privat |
Dato : 20-07-04 18:01 |
|
Peter Makholm wrote:
> "Steen Suder, privat" <sfs_news_spam@suder.dk> writes:
>
>
>>Dybest set skal jeg have alt, der står imellem 1. <HR> og 2. <HR>.
>>Jeg kan ikke være helt sikker på at de står på samme linier hver gang,
>>hvorfor min første indskydelse med at bruge head og tail ikke er egnet.
>
>
> Står <HR> på deres egne linjer?
>
> Så kan du lave noget perl:
>
> ... | perl -ne 'print if /<HR>/ ... /<HR>/' | ...
>
> Du får dog linjerne med <HR> med.
Efter at have gravet lidt mere i det (ca.):
....
$file =~/<HR>(.*?)<HR>/;
Jeg har imidlertid lige set at det faktisk er 2. og 3. <HR> objektet
står imellem.
Som jeg ser det, ændret det dog ikke meget ved det:
....
$file =~/<HR>.*?<HR>(.*?)<HR>/;
Det var en PERL-løsning i det mindste.
--
Steen Suder
Prøv at forestille dig, at du er en anden, og læs så din artikel igennem
inden du sender den. Alle har interesse i, at du staver og formulerer
dig, så godt du kan. På den måde forstås det lettere, hvad du skriver.
| |
Soren (News) (20-07-2004)
| Kommentar Fra : Soren (News) |
Dato : 20-07-04 19:51 |
|
"Steen Suder, privat" <sfs_news_spam@suder.dk> writes:
> Efter at have gravet lidt mere i det (ca.):
>
> ...
> $file =~/<HR>(.*?)<HR>/;
>
>
> Jeg har imidlertid lige set at det faktisk er 2. og 3. <HR> objektet står
> imellem.
> Som jeg ser det, ændret det dog ikke meget ved det:
>
> ...
> $file =~/<HR>.*?<HR>(.*?)<HR>/;
>
> Det var en PERL-løsning i det mindste.
meget perl specifikt og mindre unix specifikt nu .
men, en alternativ loesning:
cat file | perl -e 'my @tmp = split /<hr>/, join "", <STDIN>; print $tmp[2];'
du kan saa selv erstatte '2' med den position du har brug for..
Mvh,
--
___
Soren Davidsen / o\
Deliver yesterday, code today, think tomorrow. (_____)
__ http://www.tanesha.net/ _________________________________(___)_______
| |
Steen Suder, privat (20-07-2004)
| Kommentar Fra : Steen Suder, privat |
Dato : 20-07-04 20:02 |
|
Steen Suder, privat wrote:
> Peter Makholm wrote:
>
>> "Steen Suder, privat" <sfs_news_spam@suder.dk> writes:
>>
>>
>>> Dybest set skal jeg have alt, der står imellem 1. <HR> og 2. <HR>.
>>> Jeg kan ikke være helt sikker på at de står på samme linier hver gang,
>>> hvorfor min første indskydelse med at bruge head og tail ikke er egnet.
<KLIP>
> ...
> $file =~/<HR>.*?<HR>(.*?)<HR>/;
>
> Det var en PERL-løsning i det mindste.
Den kan f.eks. se således ud (en linie):
perl -e 'undef $/; my $f=<STDIN>; $f =~ /<HR>.*<HR>(.*?)<HR>/s; print
$1;' < wan.html
Kan det gøres bedre/kortere/mere effektivt/mere elegant *NIX-style?
--
Steen Suder
Prøv at forestille dig, at du er en anden, og læs så din artikel igennem
inden du sender den. Alle har interesse i, at du staver og formulerer
dig, så godt du kan. På den måde forstås det lettere, hvad du skriver.
| |
Peter Makholm (20-07-2004)
| Kommentar Fra : Peter Makholm |
Dato : 20-07-04 20:04 |
|
sorend@rediffmail.com (Soren (News)) writes:
> men, en alternativ loesning:
>
> cat file | perl -e 'my @tmp = split /<hr>/, join "", <STDIN>; print $tmp[2];'
Samme løsning uden en unødig cat og lidt perlmagi:
perl -n0777aF'<HR>' -e 'print $F[2]' file
Forklaring:
-n får perl til at udføre 'scriptet' for hver inddata-record.
-0777 slurp-mode, får perl til at læse hele filen i et hug
-a auto-split, splitter data op i @F
-F'<HR>' splitter på /<HR>/ istedet for på /\s+/
> du kan saa selv erstatte '2' med den position du har brug for..
Også her.
--
Peter Makholm | Perhaps that late-night surfing is not such a
peter@makholm.net | waste of time after all: it is just the web
http://hacking.dk | dreaming
| -- Tim Berners-Lee
| |
Peter Makholm (20-07-2004)
| Kommentar Fra : Peter Makholm |
Dato : 20-07-04 20:10 |
|
"Steen Suder, privat" <sfs_news_spam@suder.dk> writes:
> Den kan f.eks. se således ud (en linie):
>
> perl -e 'undef $/; my $f=<STDIN>; $f =~ /<HR>.*<HR>(.*?)<HR>/s; print
> $1;' < wan.html
>
> Kan det gøres bedre/kortere/mere effektivt/mere elegant *NIX-style?
Det er nok mere et spørgsmål om perl end om unix. Men lidt gentagelse
af mit andet indlæg, så er der en række af de ting du gør der kan
gøres lettere med nogle flag til perl:
Istedet for 'undef $/;' kan du bruge -0777. Begge dele får perl til at
gå i slurp-mode.
Når du nu alligevel kun har én ting at læse (hele filen) er det let at
putte det in i en 'while(defined($_ = <>))'-løkke. Dette gøres med
flaget -n.
Altså noget ala:
perl -0777ne '/<HR>.*<HR>(.*?)<HR>/s && print $1'
Jeg bruger && fordi det er æstetisk pænere for filer der ikke har tre
gange <HR>. Men du vil ikke kunne se forskel.
--
Peter Makholm | First you fall in love with Antarctica, and then it
peter@makholm.net | breaks your heart
http://hacking.dk | -- Antarctica
| |
|
|