Wie kann ich Leerzeichen in Bash mit einem Regexp abgleichen?

8

Ich erwarte, dass der folgende Code "ja" ausgibt, aber nicht. Aus irgendeinem Grund wird es nicht mit dem einfachen Zitat übereinstimmen. Warum?

%Vor%     
crzrcn 31.01.2015, 20:27
quelle

3 Antworten

25

Ersetzen:

%Vor%

Mit:

%Vor%

Gemäß man bash unterstützt der Operator =~ "erweiterte reguläre Ausdrücke" wie in man 3 regex definiert. man 3 regex sagt, es unterstützt den POSIX-Standard und verweist den Leser auf man 7 regex . Der POSIX-Standard unterstützt [:space:] als Zeichenklasse für Leerzeichen.

Das GNU bash Handbuch dokumentiert die unterstützten Zeichenklassen wie folgt:

>
  

Innerhalb von '[' und ']' können Zeichenklassen mit Hilfe von   Syntax [: Klasse :], wobei Klasse eine der folgenden definierten Klassen ist   im POSIX-Standard:

     

alnum alpha ascii blank cntrl Zifferngrafik niedrigerer Druck
  punct space oberes Wort xdigit

Die einzige Erwähnung von \s , die ich in der GNU bash -Dokumentation gefunden habe, war für eine nicht verwandte Verwendung in Aufforderungen wie PS1 , nicht in regulären Ausdrücken.

Die Bedeutung von *

[[:space:]] entspricht genau einem Leerzeichen. [[:space:]]* entspricht null oder mehr Leerzeichen.

Der Unterschied zwischen space und blank

POSIX reguläre Ausdrücke bieten zwei Whitespace-Klassen: [[:space:]] und [[:blank:]] :

  • [[:blank:]] bedeutet Leerzeichen und Tabulator. Dies macht es ähnlich wie: [ \t] .

  • [[:space:]] enthält neben Space und Tab auch Newline, Linefeed, Formfeed und Tab vertikal. Dies macht es ähnlich wie: [ \t\n\r\f\v] .

Ein Hauptvorteil der Verwendung von Zeichenklassen ist, dass sie für Unicode-Zeichensätze sicher sind.

    
John1024 31.01.2015, 20:44
quelle
2

Entfernen Sie die eckigen Klammern im regulären Ausdruck:

%Vor%

Wenn die eckigen Klammern vorhanden sind, wird \s inside wörtlich als übereinstimmend mit den Zeichen \ oder s interpretiert, aber Ihre Absicht ist eindeutig mit der Leerraum-Zeichenklasse zu vergleichen, für die \s eine Kurzschrift ist (und daher keine eckigen Klammern).

%Vor%     
rchang 31.01.2015 20:29
quelle
1

Das sollte funktionieren:

%Vor%

Wenn Sie keine oder keine Leerzeichen einfügen möchten, muss * nach [[:space:]] hinzugefügt werden.

    
heemayl 31.01.2015 20:53
quelle

Tags und Links