Mailinglist Archive: opensuse-de (1126 mails)

< Previous Next >
Re: '*' wird expandiert: echo "***" | while read a; do echo $a; done
  • From: Olaf Dabrunz <od@xxxxxxx>
  • Date: Fri, 7 Mar 2008 12:06:26 +0100
  • Message-id: <20080307110625.GA14607@xxxxxxx>
On 06-Mar-08, Ekkard Gerlach wrote:
* Uwe Diederich schrieb:

Versuch einmal grep:

grep -v "****" <Datei> | while ....

gibt alle Zeilen, die die Zeichenkette nicht enthalten aus.

Ich habe das mit der pipe übersehen. Also dann etwa so:

... | grep -v "****"

Letztlich brauche ich eine Möglichkeit eine Datei, die aus einer pipe


kommt, mit read einzulesen und die Zeilen mit ****..... sollen einfach


ignoriert/gelöscht werden:



... | grep -v '^\*\*\*\*'


Erklärung:

° grep -v "****"

grep erhält "****", das bedeutet "beliebig viele `*', gefolgt
von beliebig vielen `*'". Das passt auf beliebig viele "*"
irgendwo auf der Zeile.
Dabei ist grep noch "gnädig", denn eigentlich sind der erste und
der dritte "*" ein Syntax-Fehler, da "*" der "beliebig viele"
Operator ist, nur daß davor nichts kommt was beliebig oft
wiederholt werden könnte. Nur grep sagt sich: da meinte der
Mensch wohl "\*" (den normalen Stern), und nimmt den einfach.
Der zweite und der vierte "*" kommen dann nach einem "ich nehm
mal an der meint \*"-Stern, damit haben die was zum wiederholen
und tun das auch. Also steht da eigentlich '\**\**'.

Dies passt auf Zeilen wie

"ab cd efghi askjld lkasjd ********************** askldjk"
"**************** aklsdaj lsakjdlaskjda"
"akjsdjskad skd a *"
"abc"
""

usw. Also auch auf Zeilen die gar keine Sternchen enthalten.
Grund: "\**" bedeutet "beliebig viele Sternchen", inklusive
keine Sternchen. Also wenigstens null Sternchen, dann nochmal
null Sternchen. Das paßt also auf beliebige Zeilen, da jede
Zeile mindestens null Sternchen enthält.

Dies sortiert keine Zeilen aus, bringt also nichts.

° grep -v '^\*\*\*\*'

Dies liest sich

'^\*\*\*\*'
^~~~~~~~~\______
/ \
Anfang der Zeile vier normale ("literale") Sternchen

Also vier Sternchen am Zeilenanfang. Das Ganze steht in
einfachen Anführungszeichen, damit die Shell nicht die "\"
rausnimmt bevor das Ganze an grep weitergereicht wird. (Es
empfiehlt sich, alle regulären Ausdrücke in einfache
Anführungszeichen zu stellen, damit die Shell da nichts dran
ändert.)

Dies paßt auf Zeilen mit vier Sternchen am Zeilenanfang. (Danach
können natürlich weitere Sternchen kommen.)


Dies passt auf Zeilen wie

"**** asjkldjl askjd sdkjflk ksjdklqk"
"********* jdsfklj ljkslejflskjf lske"

usw.

Es passt nicht auf

"klasdjlak lkasd **** klasdjl kljasldk"
"** klajsl aslkdjlasj"
"ajklsdlaj "
""

und schmeisst damit nur die Zeilen raus die mit mindestens vier
Sternchen anfangen.

Gruß,

--
Olaf Dabrunz (od/odabrunz), SUSE Linux Products GmbH, Nürnberg

--
Um die Liste abzubestellen, schicken Sie eine Mail an:
opensuse-de+unsubscribe@xxxxxxxxxxxx
Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken
Sie eine Mail an: opensuse-de+help@xxxxxxxxxxxx

< Previous Next >
Follow Ups