2012-03-31 9 views
1

Ich bin verpflichtet, einige Operationen, die reguläre Ausdrücke beinhalten.Regex - Verwenden von Short-Hand-Zeichen in einer Zeichenklasse

String Ich bin Betrieb auf:

/dev/fd0  /media/floppy0 auto rw,us 

Im Grunde, was ich tun möchte, ist die ersten beiden Parameter übernehmen (/dev/fd0 und /media/floppy0) und ich will alles danach ignorieren. Um das zu erreichen, habe ich die unten gezeigten regulären Ausdrücke ausprobiert. Meine Frage ist, warum ergeben die folgenden regulären Ausdrücke unterschiedliche Ergebnisse?

Regulärer Ausdruck 1:

grep -o '/dev/f\S*\s*\S*' /etc/fstab 

Output (die Ausgabe, die ich erwarte):

/dev/fd0  /media/floppy0 

Regulärer Ausdruck 2:

grep -o '/dev/f[\S]*\s*[\S]*' /etc/fstab 

Ausgang:

/dev/f 

Regulärer Ausdruck 3:

grep -o '/dev/f[^\s]*\s[^\s]*' /etc/fstab 

Ausgang:

/dev/fd0  /media/floppy0 auto rw,u 

Ich sehe nicht, warum 2 und 3 haben die gleiche Ausgabe wie 1. Die Art, wie ich es nicht produzieren zu sehen ist, dass für 2, sollte es egal sein, ob ich das nicht-weiße Leerzeichen Short-Hand-Zeichen (\S) innerhalb einer Zeichenklasse setzen. Das gleiche gilt für 3. Außerdem, warum unterscheidet sich 2 von 3? Ist [\S] das gleiche wie [^\s]?

Antwort

2

Ich denke, ich kann nicht sprechen, ob sie „sollte“ anders sein — gibt es viele regex Motoren, bei denen Ihre Interpretationen korrekt — aber in POSIX Grund Reguläre Ausdrücke sein würde (BREs, die regex Typ dass grep standardmäßig verwendet) [\S] ist eine Zeichenklasse, die \ und S enthält, und [^\s] ist eine Zeichenklasse, die alle Zeichen außer \ und s enthält. (Dies gilt für die Spezifikation, die sowohl in BREs als auch in EREs erfordert, dass die Sonderzeichen , '*', '[' und '\' (Punkt, Sternchen, linker Rahmen und umgekehrter Schrägstrich) ihre besondere Bedeutung verlieren a. Ausdruck in eckigen Klammern“[link]) Die in-character-Klasse Äquivalent \s ist [:space:]:

grep -o '/dev/f[^[:space:]]*\s*[^[:space:]]*' /etc/fstab 

Einige Versionen von grep Unterstützung eine Nicht-Standard--P Option Perl-kompatible reguläre Ausdrücke (PCREs) anstelle von POSIX zu verwenden Reguläre Ausdrücke. Perl-kompatible reguläre Ausdrücke tun das Verhalten haben Sie beschreiben, also, wenn Ihr grep diese Option unterstützt, dann können Sie es wie folgt verwenden:

grep -o -P '/dev/f[\S]*\s*[\S]*' /etc/fstab 
grep -o -P grep -o '/dev/f[^\s]*\s[^\s]*' /etc/fstab 
+0

Great! Danke für die Erklärung. – kpatelio

+0

@ user600194: Gern geschehen! – ruakh

Verwandte Themen