Suche analogen Shell Befehl zu

N

Nano

Foren As
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
 
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.
 
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
 
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

man bash schrieb:
[[ expression ]]
(...)
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)). The return value is 0 if the string matches the pattern, and 1 otherwise.
(...)
Substrings matched by parenthesized subexpressions within the regular expression are saved in the array variable BASH_REMATCH. The element of BASH_REMATCH with index 0 is the portion of the string matching the entire regular expression. The element of BASH_REMATCH with index n is the portion of the string matching the nth parenthesized subexpression.

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
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
ok habe den übeltäter gefunden, der regex muss mit "" gequotet werden
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..)
 
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
 
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.
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.
 

Ähnliche Themen

Kurzzusammenfassung der Befehle und Progr. für die shell

Werte aus Dateien lesen

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

nach einem String suchen und anschließend wert speichern

Shell if-Abfrage mit equal or greater wirft Fehlermeldung unary operator expected

Zurück
Oben