Suche analogen Shell Befehl zu

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Nano, 09.03.2008.

  1. Nano

    Nano Foren As

    Dabei seit:
    02.12.2006
    Beiträge:
    93
    Zustimmungen:
    0
    Hi gibt es einen befehl der den selben zweck erfüllt wie in perl

    Code:
    $string =~ /([abc])/
    print $1; 
    
    
    also aus einem string den wert eines regex ausliest ?
    das ganze soll wiegesagt ohne perl funktionieren
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Jabo

    Jabo Aufgabe ohne Minister

    Dabei seit:
    12.10.2006
    Beiträge:
    1.322
    Zustimmungen:
    0
    Ort:
    Hamburg
    grep -o Ausdruck Datei könntest du meinen?
    Code:
    ~>cat test.txt
    Jens ist doof
    Klaus ist nicht doof
    Lisa ist undoof
    Das Leben ist [_________]
    
    ~>grep doof test.txt
    Jens ist doof
    Klaus ist nicht doof
    Lisa ist undoof
    
    ~>grep -o "\bdoof\b" test.txt
    doof
    doof
    
    Der letzte Fall trifft auf "doof" zu, aber nur, wenn es innerhalb von Wortgrenzen steht (also nicht "undoof). Durch die Option -o wird nur der zutreffende Teil der Zeile ausgegeben, während grep sonst die Zeilen ganz ausgibt, in denen der Ausdruck vorkommt.
     
  4. #3 Wolfgang, 09.03.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Du wirst dazu kein Gleichnis finden, wohl aber für spezielle Fälle spezielle Lösungen.
    Auch ist es abhängig davon, welche Shell du verwendest.

    Mögliche Lösungen gehen von Parameterexpansion bis Zusatzhilfsmittel wie cut tr sed und eben auch wieder Perl und awk usw.

    Gruß Wolfgang
     
  5. #4 Gott_in_schwarz, 09.03.2008
    Zuletzt bearbeitet: 09.03.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    naja, es gibt einen riesigen unterschied zwischen "nicht perl" und "shell", weil es wie bereits hier gesagt viele tools gibt, die auch mit regexes arbeiten. (awk, grep, etc.)

    und auch bei "shell" müsstest du etwas genauer sein...

    ANYWHO, some might call it bloat:
    Code:
    var="fooZOMGbar"
    if [[ "$var" =~ ^foo(.+)bar$ ]]; then
        echo "${BASH_REMATCH[1]}"       # gibt ZOMG aus
    fi
    funktioniert hier mit meiner bash:
    Code:
    bash --version
    GNU bash, version 3.2.25(1)-release

    [edit]:
    geht sogar ohne if-abfrage:
    Code:
    var="bla catch me if you can blub"
    [[ "$var" =~ ^bla(.+)blub$ ]]
    echo ${BASH_REMATCH[1]} # gibt aus: catch me if you can
     
  6. #5 Nano, 10.03.2008
    Zuletzt bearbeitet: 10.03.2008
    Nano

    Nano Foren As

    Dabei seit:
    02.12.2006
    Beiträge:
    93
    Zustimmungen:
    0
    erstmal danke für die antworten, was das den letzten post betrifft

    das wäre genau da was ich suche allerdings

    ./test: line 4: syntax error in conditional expression: unexpected token `('
    ./test: line 4: syntax error near `^foo(.'
    ./test: line 4: `if [[ "$var" =~ ^foo(.+)bar$ ]]; then'

    die klammern werden erst garnicht angenommen, hast du nicht irgendetwas eingebunden ?

    ich arbeite mit

    GNU bash, version 3.00.16(1)-release (sparc-sun-solaris2.10)
    Copyright (C) 2004 Free Software Foundation, Inc.

    ---------------------------------------------------------------
    ok habe den übeltäter gefunden, der regex muss mit "" gequotet werden
     
  7. #6 Gott_in_schwarz, 10.03.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    bah, das ist echt ein unding und einer der gründe, warum man das eigentlich nicht benutzen sollte. das (also die regex..) darf ich hier nämlich überhaupt nicht quoten, sonst "erkennt" die bash die regex als string und nicht als regex... irgendwann zwischendurch ging wohl auch beides und boah, naja. verwende lieber einen der üblichen verdächtigen ((e)grep, sed, awk, etc.) statt dieses unportablen konstrukts. (irgendwo um version 3.2 wurde das verändert..)
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. Jabo

    Jabo Aufgabe ohne Minister

    Dabei seit:
    12.10.2006
    Beiträge:
    1.322
    Zustimmungen:
    0
    Ort:
    Hamburg
    Hm, also zumindest bei mir in dem Beispiel muß ich quoten, damit sowas wie \b überhaupt geht.

    Ich hatte mir gedacht, daß man das muß, weil *sonst* auf der Seite von grep das ganze nicht heile ankommt. Ich dachte, daß die bash das als String ansehen und an grep übergeben *muß*, damit grep den komplett übergeben bekommt und dann seinerseits merkt, daß es ein regulärer Ausdruck mit Wortgrenzen ist. Aber ich bin auch bei weitem alles andere als der Syntax-Guru für bash :)

    Innerhalb eines Shellscriptes mag das anders aussehen, aber das war die ursprüngliche Frage gar nicht... die war nach einem Befehl, der aus einer Zeile innerhalb einer Datei was raus sucht und den Rest weg läßt.

    Folgendes passiert unter Debain Lenny, man sehe auch die Versionsangaben... und das ist ja relativ neu alles. Noch viel neuere Sachen würde ich nicht unbedingt als Kompatibilitätsmaßstab ansehen:

    Code:
    $ cat test.txt
    Jens ist doof
    Klaus ist nicht doof
    Lisa ist undoof
    Das Leben ist [_________]
    doof doof doof und undoof ist doof
    
    $ grep -on \bdoof\b test.txt
    $ [color=gray][i] <--- keine Ausgabe![/i][/color]
    
    $ grep -on "\bdoof\b" test.txt
    1: doof
    2: doof
    5: doof
    5: doof
    5: doof
    5: doof
    
    $ grep -V
    GNU grep 2.5.3
    [color=gray][i][....][/i][/color]
    
    $ bash --version
    GNU bash, version 3.[color=red]1[/color].17(1)-release [color=gray][i][....]
    merke, das ist unter 3.2 und noch nicht mal "stable" ...[/i][/color]
    
    $ cat /etc/issue
    Debian GNU/Linux lenny/sid
    
     
  10. #8 Gott_in_schwarz, 10.03.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    vollkommen richtig, ich meinte ja auch das bash-internal:
    Code:
    [[ "$foo" =~ regex ]]
    wo sich die quoting regeln in den letzten versionen recht drastisch geändert haben:
    von: man muss (die regex) quoten, über: man darf (die regex) quoten, bis: wenn man (die regex) quotet, geht die welt unter..
    innerhalb dieses konstrukts gelten spezielle quoting regeln, sodass die regex auch ohne quoting vom globbing "beschützt" ist. quotet man die regex, so versucht die bash einfaches string matching. wobei man das mit regexes auch kann, von daher zerrinnt mir da ein wenig der sinn zwischen den fingern...

    wenn man ein externes regex tool verwendet (sed, awk, grep, perl...) muss man die argumente, so sie denn regexes sind, in der tat quoten, um die bash vom interpretieren der metazeichen (asterisk, fragezeichen..) zu hindern. (es sei denn, man steht auf überraschungen.)

    und was die frage des threaderstellers angeht: kommt halt drauf an, was er genau machen will, ob das mit (e)grep -o geht. wenn das beispiel von ihm oben alles ist, was er machen will, dann ja: das geht. geklammerte "teilausdrücke" aus dem gesamten gematchten string könnte man vielleicht über mehrere (e)grep -o pipes emulieren oder so, aber da dann auch nur eine klammer auf einmal. alles schon ein ziemlicher workaround, wenn man bedenkt, dass sed das zb "out of the box" kann.
     
Thema:

Suche analogen Shell Befehl zu

Die Seite wird geladen...

Suche analogen Shell Befehl zu - Ähnliche Themen

  1. Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...

    Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...: Ich habe eine Textdatei in der ich Einträge bis zum 3. Leerzeichen mit den restlichen Zeilen (auch nur bis 3. Leerzeichen) vergleichen muss und...
  2. Shell-Skript Datum in einer Datai suchen

    Shell-Skript Datum in einer Datai suchen: Hallo zusammen Ich komm eigentlich aus der Klicki-Bunti-Welt von Windows. Seit geraumer Zeit versuche ich meine Künste mit verschiedenen...
  3. [Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

    [Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter: Hallo zusammen, ich bin an einem Punkt angekommen, wo ich nicht mehr weiter komme und hoffe ihr könnt mir weiter helfen. Anbei ein Ausschnitt aus...
  4. Funktionssuche in C: Emacs oder Vim?

    Funktionssuche in C: Emacs oder Vim?: Hallo, ich muss mir häufig C-Projekte angucken, und dann suche ich bspw., wo eine aufgerufene Funkion definiert oder deklariert (Header) wird....
  5. Artikel: Suche und Analyse in Echtzeit mit Elasticsearch und dem Elastic Stack

    Artikel: Suche und Analyse in Echtzeit mit Elasticsearch und dem Elastic Stack: Mit dem Elastic Stack kann man in Echtzeit die wichtigen Informationen aus jedem Datensatz herauslesen, ungeachtet seiner Größe. Dieser Artikel...