grep Befehl funktioniert nicht mehr



  • Hi @ll!

    Hab mal eine kurze Frage.
    Ich hab mit einem shell Skript und dem grep Tool folgendes gemacht.

    echo dddd*Hallo*dddd  | grep "*" >/texts/bbbb.txt
    

    Zu erklärung: Mit Hilfe von Grep möchte ich das, was zwischen den"*" steht in die Datei bbbb.txt speichern. Genau das hat vorhin funktioniert. Aber seit gut einer Stunde macht der das nicht mehr. Jetzt speicher er die komplette Zeile in der Datei ab. 😡
    Woran liegt das ? Hab auch schon mal alles neue getippt und rebootet etc.

    Hat so ein Problem schon mal jemand gehabt und weiß eine Lösung?

    Danke im vorraus !

    Gruß,
    Dirk



  • So kann das nicht funktioniert haben, grep gibt ja gematchte Zeilen aus.
    Du bräuchtest hierfür eher sed.



  • Da das sed-Kommando hierfür etwas kryptisch aussieht, gibts Nachhilfe von mir:

    echo 'dddd*Hallo*dddd'  | sed -e 's/^.*\*\(.*\)\*.*$/\1/g' > bbbb.txt
    


  • Erklärung:
    grep macht nur pattern matching und gibt die Zeile zurück, die das Matching erfüllt. Deswegen wird das mit grep nicht klappen, weil du die gesamte Zeile bekommst.

    Außerdem ist es * bei den Ausdrücken ein Sonderzeichen, das sagt, dass es beliebig viele Wiederholungen haben darf, aber "" ist falsch. Wenn du * im Text suchst, dann muss * geescaped werden, also "\"

    sed ist ein stream editor, der sucht in einem Text und macht wie grep pattern matching. sed bekommt befehle, wie s/ausdruck1/ausdruck2/modifier der dazu dient, das was er mittels ausdruck1 gefunden hat, durch ausdruck2 ersetzen muss.Der Ausdruck ausdruck1 wäre dann ^.\\(.\)\.$
    sieht total kryptsich, ist aber super einfach zu lesen.
    ^ steht immer für den Anfang der Zeile, .
    steht für beliebig viele Wiederholungen eines belibigen Zeichens. \* steht für "such nach einem *" und \(...\) ist Block, der später als \1 benutzt werden kann (bzw. \2 orde \3 ode ... je nachdem wie viele Blöcke es davor gibt). Was ist Block ist, sollte dir klar sein.
    $ steht für Ende der Zeile (bei dem Beispiel braucht man im Prinzip ^ und $ gar nicht, aber stören uns auch nicht).
    Der Ausdruck ausdruck2 ist diesem Fall nur \1, das bedeutet, dass du gesamte Zeile, die durch ausdruck1 gefunden wurde durch den Inhalt des Blockes ersetzt werden soll, sprich, gibt den Text aus, der zwischen den beiden ... steht. Deswegen ja der Block.
    Der Modifiert /g steht dazu da, dass man weiter ersetzen soll, wenn man schon etwas ersetzt hat (dazu solltest du liebr man sed machen).



  • Vielen vielen Dank! 😃
    Hat super funktioniert und jetzt bin ich auch schlauer was sed und grep angeht.
    Kennt ihr vielleicht ein gutes Buch bzw Interentseite, wo man so was noch mal nachlesen kann?
    Ich hab nur das Shell Buch vom Ditchen, der geht leider nicht so gut auf sed und die anderen ein.

    Wünsche euch einen schönen November Tag! 😃
    Gruß,

    Dirk



  • Devender schrieb:

    Kennt ihr vielleicht ein gutes Buch bzw Interentseite, wo man so was noch mal nachlesen kann?

    Bei IBM Developer Works gab es eine Mini-Serie zu sed und awk, die ich ganz nett fand, hier sind mal die sed-URLs, die awk-Sachen findest Du bestimmt auch recht leicht.
    http://www-128.ibm.com/developerworks/library/l-sed1.html
    http://www-128.ibm.com/developerworks/library/l-sed2.html
    http://www-128.ibm.com/developerworks/library/l-sed3.html

    Auf totem Baum dürfte das hier recht gut sein:
    Sed & Awk | ISBN: 1565922255

    edit: Ach, was soll's, hier noch die URLs zur awk-Reihe:
    http://www-128.ibm.com/developerworks/library/l-awk1.html
    http://www-128.ibm.com/developerworks/library/l-awk2.html
    http://www-128.ibm.com/developerworks/library/l-awk3.html



  • Ich finde dieses Buch sehr schoen:
    Awk & sed | ISBN: 3827320941



  • Das ist eben Linux.

    Da gibt's für ein einzelnes Kommando sogar ganze Bücher... 😃 👍



  • Sgt. Nukem schrieb:

    Da gibt's für ein einzelnes Kommando sogar ganze Bücher... 😃 👍

    Darin werden sowohl Regexp-Grundlagen erklärt, als auch die Programme sed und awk.
    Und für Minisprachen halte ich ein eigenes Buch durchaus für angebracht.

    Wenn man mal mit einem "einzelnen Kommando" sowas machen kann, dann verdient das durchaus eine gesonderte Behandlung.



  • wahnsinn, sokoban mit sed, das haette ich nie gedacht.



  • nman schrieb:

    Sgt. Nukem schrieb:

    Da gibt's für ein einzelnes Kommando sogar ganze Bücher... 😃 👍

    Darin werden sowohl Regexp-Grundlagen erklärt, als auch die Programme sed und awk.
    Und für Minisprachen halte ich ein eigenes Buch durchaus für angebracht.

    Das habe ich mir schon gedacht.
    Ich wollte keinesfalls flamen, nur zum Schmunzeln anregen.
    Ich stehe schließlich auch des öfteren schonmal mit sed und awk auf Kriegsfuß... 😡
    Auch ist mir die Mächtigkeit der Tools durchaus bewußt...

    nman schrieb:

    Wenn man mal mit einem "einzelnen Kommando" sowas machen kann, dann verdient das durchaus eine gesonderte Behandlung.

    ...naja, vielleicht doch nicht!! 😮 😮

    Das hat soeben "Wolfenstein 3D in JavaScript" vom ersten Platz verdrängt!! 😮 👍


Anmelden zum Antworten