Verständnisfrage zu RegExps

S

steff123

Grünschnabel
Hallo Leute,
ich bastle gerade an einem Shell-Script und brauche dabei ein paar RegExps. Bisher hatte ich mich mit RegExps wenig auseinander gesetzt, da es nur ein privates Vergnügen ist.

Nachdem ich mich im Internet ein bisschen in die Thematik eingelesen habe, wollte ich die IP-Adresse aus folgender XML-Syntax greppen und habe das Script unten erstellt. Ich verstehe nur nicht warum in der Variante "Test 1 Extended" auch DE.mpg.mp4.otr zurückgegeben wird und nicht in der Perl-Variante? Und warum \b die Wirkung in Test 2 hat? Soll \b nicht bewirken, dass ein gesamtes Wort zurückgegeben wird?

Danke für die Antworten schonmal

Folgenden Test-String habe ich verwendet
Code:
<link>http://81.95.11.2/xbt/xbt_torrent_create.php?filename=BLABLABLA__TVOON_DE.mpg.mp4.otrkey&amp;userid=2272565&amp;mode=free&amp;hash=1092df2ae8c1f100bc2a5676c566d5f3</link>

Hier das Test-Script
Code:
uname -a
/opt/bin/grep --version
echo
echo
echo IP-Adresse extrahieren
echo Test 1 Perl
/opt/bin/grep -P -o "([0-9]{1,3}[.]){3}[0-9]{1,3}" test.txt
echo Test 1 Extended
/opt/bin/grep -E -o "([0-9]{1,3}[.]){3}[0-9]{1,3}" test.txt
echo Test 2 Perl
/opt/bin/grep -P -o "\b([0-9]{1,3}[.]){3}[0-9]{1,3}\b" test.txt
echo Test 2 Extended
/opt/bin/grep -E -o "\b([0-9]{1,3}[.]){3}[0-9]{1,3}\b" test.txt
echo Test 3 Perl
/opt/bin/grep -P -o "(\d{1,3}[.]){3}\d{1,3}" test.txt
echo Test 3 Extended
/opt/bin/grep -E -o "([[:digit:]]{1,3}[\.]){3}[[:digit:]]{1,3}" test.txt

Hier die Ausgabe
Code:
Linux NAS001 3.4.6 #1 Fri Oct 3 16:06:36 CST 2014 armv5tel unknown
/opt/bin/grep (GNU grep) 2.12
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

IP-Adresse extrahieren
Test 1 Perl
81.95.11.2
Test 1 Extended
81.95.11.2
DE.mpg.mp4.otr
Test 2 Perl
81.95.11.2
Test 2 Extended
81.95.11.2
Test 3 Perl
81.95.11.2
Test 3 Extended
81.95.11.2
 
Komische Klammersetzung, die du da benutzt. Die Fehlausgabe rührt meiner Meinung nach von
Code:
[.]){3}
her. Punkt ist selbst ein "Jokerzeichen", wenn du einen Punkt greppen willst, dann musst du deshalb \. schreiben.

Code:
egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
 
Zusätzlich wird die Komplexität gesteigert durch die Shell selbst. Deswegen sind auch die Quotes "..." wichtig.
Sonst würde Dir die Shell das \ - Zeichen(Backslash) wegfangen und nicht als Teil des Argumentes an grep weitergeben.
Der Backslash hat nämlich sowohl in der Shell als auch in grep die gleiche Sonderbedeutung.
 

Ähnliche Themen

Proton 6.3: Valve bringt zahlreiche neue Spiele auf Linux

NAS-Drive Mount in Bash-Script über crontab

script sshpass

E/A-Fehler (.snapshots is not a btrfs subvolume).

Verschlüsseltes Backup-Script mit rsync

Zurück
Oben