/ 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
[sh-script] bevare CR/NL med grep?
Fra : Bjarne Wichmann Pete~


Dato : 05-02-03 10:53

Jeg har et lille script:

#!/bin/sh
OUT=$(egrep -v "[0-9]*.[0-9]*@mail6.wannafind.dk" "$1")
echo $OUT

Problemet er at det fjerner alle CR/LF. Hvordan laver jeg ovenstående *og*
bevarer CR/LF?

Bjarne

 
 
Claus Rasmussen (05-02-2003)
Kommentar
Fra : Claus Rasmussen


Dato : 05-02-03 11:22

Bjarne Wichmann Petersen wrote:

> #!/bin/sh
> OUT=$(egrep -v "[0-9]*.[0-9]*@mail6.wannafind.dk" "$1")
> echo $OUT
>
> Problemet er at det fjerner alle CR/LF. Hvordan laver jeg ovenstående *og*
> bevarer CR/LF?

Har du prøvet og lade være med at bruge en variabel ? Altså blot skrive

egrep -v "..." "$1"

Ellers 'man unix2dos'

-Claus


Bjarne Wichmann Pete~ (05-02-2003)
Kommentar
Fra : Bjarne Wichmann Pete~


Dato : 05-02-03 12:44

Claus Rasmussen wrote:

>> #!/bin/sh
>> OUT=$(egrep -v "[0-9]*.[0-9]*@mail6.wannafind.dk" "$1")
>> echo $OUT
>> Problemet er at det fjerner alle CR/LF. Hvordan laver jeg ovenstående
>> *og* bevarer CR/LF?
> Har du prøvet og lade være med at bruge en variabel ? Altså blot skrive
> egrep -v "..." "$1"
> Ellers 'man unix2dos'

Ok, vist mig der ikke er så god til at forklare mig; har ikke så meget styr
på linieskift (CR, CR/LF etc). Men jeg har en unix-tekst (må det være, er
en mail fra KMail), hvor jeg gerne vil have fjernet en linie (Message-ID:
<xxxxxxxx.xxxxxxx@mail6.wannafind.dk>"). Problemet med mit ovenstående
lille script er at alle linieskift bliver fjernet fra mail'en...

Så hvordan fjerner jeg en linie *uden* at miste alle linieskift?

Bjarne

Adam Sjøgren (05-02-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 05-02-03 13:11

On Wed, 05 Feb 2003 12:44:27 +0100, Bjarne Wichmann Petersen wrote:

>> Har du prøvet og lade være med at bruge en variabel ? Altså blot
>> skrive egrep -v "..." "$1" Ellers 'man unix2dos'

> Ok, vist mig der ikke er så god til at forklare mig;

Har du rent faktisk prøvet det Claus Rasmussen foreslår?

Det virker:

$ egrep -v '^Message-ID: <[^@]+@mail6.wannafind.dk>'
I'm like
Message-ID: <bruceleebrucelaah@mail6.wannafind.dk>
whatever!

I'm like
whatever!

^D
$ OUT=$(egrep -v '^Message-ID: <[^@]+@mail6.wannafind.dk>')
I'm like
Message-ID: <bruceleebrucelaah@mail6.wannafind.dk>
whatever!

^D
$ echo $OUT
I'm like whatever!
$


Mvh.

--
"nu skall vi dansa efter min pipa Adam Sjøgren
nu skall vi dansa efter min pipa" asjo@koldfront.dk

Bjarne Wichmann Pete~ (05-02-2003)
Kommentar
Fra : Bjarne Wichmann Pete~


Dato : 05-02-03 14:13

Adam Sjøgren wrote:

>>> Har du prøvet og lade være med at bruge en variabel ? Altså blot
>>> skrive egrep -v "..." "$1" Ellers 'man unix2dos'
>> Ok, vist mig der ikke er så god til at forklare mig;
> Har du rent faktisk prøvet det Claus Rasmussen foreslår?

Ja

#!/bin/sh
grep -v "..." "$1"

giver mig bare en tom fil. Men kørt fra konsol/prompt får jeg nogle
linieskift.

> Det virker:
> [...]
> $ egrep -v '^Message-ID: <[^@]+@mail6.wannafind.dk>'
> $ OUT=$(egrep -v '^Message-ID: <[^@]+@mail6.wannafind.dk>')
> I'm like
> Message-ID: <bruceleebrucelaah@mail6.wannafind.dk>
> whatever!
>
> ^D
> $ echo $OUT
> I'm like whatever!

Er det med vilje at linieskiftende er væk i det sidste eksempel? Er
budskabet at hvis jeg indsætter outputtet fra grep i en variabel, så
forsvinder linieskift? Og hvordan retunerer jeg så resultatet?

Bjarne

Claus Rasmussen (05-02-2003)
Kommentar
Fra : Claus Rasmussen


Dato : 05-02-03 14:37

Bjarne Wichmann Petersen wrote:

> grep -v "..." "$1"

Du skal erstatte "..." med dit regulære udtryk. Ellers skriver grep
kun linier ud, der er mindre end tre tegn lange.


> Er det med vilje at linieskiftende er væk i det sidste eksempel?

Ja.


> Er
> budskabet at hvis jeg indsætter outputtet fra grep i en variabel, så
> forsvinder linieskift? Og hvordan retunerer jeg så resultatet?

Prøv nu mit eksempel først. Det er ret elementær shell-programmering
det her. For at lære det kræves det altså, at du selv bruger nogen
tid på selv at eksperimentere med tingene. Det er ikke for at være
træls, men det er simpelthen den bedste måde at lære tingene på.

-Claus


Bjarne Wichmann Pete~ (05-02-2003)
Kommentar
Fra : Bjarne Wichmann Pete~


Dato : 05-02-03 16:23

Claus Rasmussen wrote:

> Prøv nu mit eksempel først. Det er ret elementær shell-programmering
> det her. For at lære det kræves det altså, at du selv bruger nogen
> tid på selv at eksperimentere med tingene. Det er ikke for at være
> træls, men det er simpelthen den bedste måde at lære tingene på.

# egrep -v "^Message-ID:[[:print:]]<[0-9]*.[0-9]*@mail6.wannfind.dk>"

Bibeholder linjeskift

# OUT=$(egrep -v "^Message-ID:[[:print:]]<[0-9]*.[0-9]*@mail6.wannfind.dk>")
# echo $OUT

Fjerner linjeskift

Hvorfor forskellen, forstår jeg bare ikke? I mine øjne gør de 2
fremgangsmåder nøjagtig det samme.

Bjarne

Kim Hansen (05-02-2003)
Kommentar
Fra : Kim Hansen


Dato : 05-02-03 17:06

Bjarne Wichmann Petersen <nospam.nospam@mekanix.dk> writes:

> Claus Rasmussen wrote:
>
> > Prøv nu mit eksempel først. Det er ret elementær shell-programmering
> > det her. For at lære det kræves det altså, at du selv bruger nogen
> > tid på selv at eksperimentere med tingene. Det er ikke for at være
> > træls, men det er simpelthen den bedste måde at lære tingene på.
>
> # egrep -v "^Message-ID:[[:print:]]<[0-9]*.[0-9]*@mail6.wannfind.dk>"
>
> Bibeholder linjeskift
>
> # OUT=$(egrep -v "^Message-ID:[[:print:]]<[0-9]*.[0-9]*@mail6.wannfind.dk>")
> # echo $OUT
>
> Fjerner linjeskift
>
> Hvorfor forskellen, forstår jeg bare ikke? I mine øjne gør de 2
> fremgangsmåder nøjagtig det samme.

Det er $(command) der gør sådan, fra bash(1):

Command Substitution
Command substitution allows the output of a command to replace the com-
mand name. There are two forms:

$(command)
or
`command`

Bash performs the expansion by executing command and replacing the com-
mand substitution with the standard output of the command, with any
trailing newlines deleted. Embedded newlines are not deleted, but they
may be removed during word splitting. The command substitution $(cat
file) can be replaced by the equivalent but faster $(< file).

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Claus Rasmussen (05-02-2003)
Kommentar
Fra : Claus Rasmussen


Dato : 05-02-03 18:05

Kim Hansen wrote:

> Det er $(command) der gør sådan, fra bash(1):

Nej:

> ... Embedded newlines are not deleted, but they may be removed during
> word splitting. ...

Det er echo kommandoen, der gør det. Prøv at lave en fil med tre linier:

hej
med
dig



v=$(cat fil)
echo $v

Give een linie 'hej med dig'. Mens

echo "$v"

Giver tre linier.

-Claus


Kim Hansen (05-02-2003)
Kommentar
Fra : Kim Hansen


Dato : 05-02-03 18:37

Claus Rasmussen <clr@cc-consult.dk> writes:

> Kim Hansen wrote:
>
> > Det er $(command) der gør sådan, fra bash(1):
>
> Nej:
>
> > ... Embedded newlines are not deleted, but they may be removed during
> > word splitting. ...

Du har ret i det ikke var $(), jeg havde kun set at den fjernede det
sidste linjeskift og så extrapoleret, dvs. ikke læst det jeg quotede
ordentligt :)

> Det er echo kommandoen, der gør det. Prøv at lave en fil med tre linier:

Men jeg tror heller ikke du har ret i at det er echo, jeg er faktisk
ret sikker på at det er shellen der retter i input inden det gives til
echo. \n læses som whitespace og derfor tolkes det som om det er 3
argumenter der så udskrives af echo med mellemrum. Dette er samme
opførelse bare med mellemrum og uden variable:

kim@kanon$ echo hej med dig
hej med dig
kim@kanon$ echo "hej med dig"
hej med dig
kim@kanon$

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Claus Rasmussen (05-02-2003)
Kommentar
Fra : Claus Rasmussen


Dato : 05-02-03 18:40

Kim Hansen wrote:

>> Det er echo kommandoen, der gør det. Prøv at lave en fil med tre linier:
>
> Men jeg tror heller ikke du har ret i at det er echo, jeg er faktisk
> ret sikker på at det er shellen der retter i input inden det gives til
> echo.

Det var egenligt også det, jeg mente (selv om jeg skrev noget andet).
Det står faktisk i det afsnit jeg citerede: "but [newlines] may be
removed during word splitting". "Word splitting" er shellens ansvar.

-Claus


Claus Rasmussen (05-02-2003)
Kommentar
Fra : Claus Rasmussen


Dato : 05-02-03 17:11

Bjarne Wichmann Petersen wrote:

> Claus Rasmussen wrote:
>
>> Prøv nu mit eksempel først. Det er ret elementær shell-programmering
>> det her. For at lære det kræves det altså, at du selv bruger nogen
>> tid på selv at eksperimentere med tingene. Det er ikke for at være
>> træls, men det er simpelthen den bedste måde at lære tingene på.
>
> # egrep -v "^Message-ID:[[:print:]]<[0-9]*.[0-9]*@mail6.wannfind.dk>"
>
> Bibeholder linjeskift
>
> # OUT=$(egrep -v
> # "^Message-ID:[[:print:]]<[0-9]*.[0-9]*@mail6.wannfind.dk>") echo $OUT
>
> Fjerner linjeskift
>
> Hvorfor forskellen, forstår jeg bare ikke? I mine øjne gør de 2
> fremgangsmåder nøjagtig det samme.

Hvorfor tror du, at de to ting gør det samme ?

Forskellen ligger i, at i det første eksempel sender du grep's output
direkte til skærmen. I det andet læser du det først ind i en variabel,
som du så skriver med echo.

Der, hvor det går galt, er i 'echo $OUT'. Shellen har nemlig den regel,
at hvis du skriver noget på kommandolinien, der er adskilt af newline,
så erstatter shellen newlines med blanke, før den giver resultatet til
kommandoen. Dvs. at 'echo' programmet aldrig ser dine newlines. Dem
har shellen spist allerede.

Måden, man kan undgå det på, er at fortælle shellen, at den skal holde
fingrene for sig selv. Det gør man ved at "quote" enten med pinger (')
eller med gås ("). Pinger quoter _alt_. Også $OUT konstruktionen, så
den kan ikke bruges her. Men gås dur':

OUT=$(grep ...)
echo "$OUT"

Men hvis du ikke skal bruge din variabel til noget, bør du bruge grep
alene, som jeg oprindeligt foreslog. Der er i øvrigt et langt afsnit i
'man bash', der handler om quoting.

-Claus


Bjarne Wichmann Pete~ (05-02-2003)
Kommentar
Fra : Bjarne Wichmann Pete~


Dato : 05-02-03 18:44

Claus Rasmussen wrote:

> Måden, man kan undgå det på, er at fortælle shellen, at den skal holde
> fingrene for sig selv. Det gør man ved at "quote" enten med pinger (')
> eller med gås ("). Pinger quoter _alt_. Også $OUT konstruktionen, så
> den kan ikke bruges her. Men gås dur':

ahhh.... takker! ;)

Bjarne

Adam Sjøgren (05-02-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 05-02-03 16:54

On Wed, 05 Feb 2003 14:12:57 +0100, Bjarne Wichmann Petersen wrote:

> Er det med vilje at linieskiftende er væk i det sidste eksempel?

Ja, det var for at illustrere forskellen.


Mvh.

--
"Did You have a horrid journey?" Adam Sjøgren
"Yes, fairly horrid." asjo@koldfront.dk

Adam Sjøgren (05-02-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 05-02-03 17:03

On Wed, 05 Feb 2003 16:23:24 +0100, Bjarne Wichmann Petersen wrote:

> Hvorfor forskellen, forstår jeg bare ikke? I mine øjne gør de 2
> fremgangsmåder nøjagtig det samme.

Så må dine øjne godt nok være specielle.

RTFM.


Mvh.

--
Hint: echo "$OUT" er ikke det samme som echo $OUT Adam Sjøgren
asjo@koldfront.dk

Andreas Hinz (05-02-2003)
Kommentar
Fra : Andreas Hinz


Dato : 05-02-03 18:40

Wed, 05 Feb 2003 12:44:27 +0100
skrev Bjarne Wichmann Petersen <nospam.nospam@mekanix.dk>:

> være, er en mail fra KMail), hvor jeg gerne vil have fjernet en linie
> (Message-ID:<xxxxxxxx.xxxxxxx@mail6.wannafind.dk>").
>
Hej,
hvis du er ude på at slette "Message-Id" linen uanset hvad der står i den,
kan du erstatte dit script med:

formail -I "Message-Id:" < $1

--
Med venlig hilsen / Best regards / Mit freundlichen Grüssen

Andreas Hinz

Bjarne Wichmann Pete~ (05-02-2003)
Kommentar
Fra : Bjarne Wichmann Pete~


Dato : 05-02-03 19:47

Andreas Hinz wrote:

> Hej,
> hvis du er ude på at slette "Message-Id" linen uanset hvad der står i den,
> kan du erstatte dit script med:

Tak, men det er jeg ikke... jeg er bare ud på at slette den *ekstra*
Message-ID wannafinds server indsætter i alle mails, så KMail kan se den
originale og tråde mine mails! ;)

Bjarne

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408943
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste