Wie kann ich mit Räumen mit einer regexp in der Bash?
Ich erwarte, dass Sie den code unten echo "ja", aber es funktioniert nicht. Aus irgendeinem Grund es wird nicht mit dem einfachen Anführungszeichen. Warum?
str="{templateUrl: '}"
regexp="templateUrl:[\s]*'"
if [[ $str =~ $regexp ]]; then
echo "yes"
else
echo "no"
fi
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersetzen:
Mit:
Laut
man bash
, die=~
operator unterstützt "extended regular expressions" definiert inman 3 regex
.man 3 regex
sagt, es unterstützt den POSIX standard und verweist den Leser aufman 7 regex
. Der POSIX-standard unterstützt[:space:]
als Charakter-Klasse für whitespace.Den GNU
bash
manuell Dokumente, die die unterstützten Zeichen-Klassen wie folgt:Die einzige Erwähnung von
\s
dass ich in der GNUbash
Dokumentation wurde für die unabhängige Nutzung in Aufforderungen, wiePS1
, nicht in regulären Ausdrücken.Die Bedeutung von
*
[[:space:]]
entsprechen genau eine white-space-Zeichen.[[:space:]]*
entsprechen null oder mehr white-space-Zeichen.Der Unterschied Zwischen
space
undblank
Reguläre POSIX-Ausdrücke bieten zwei Klassen von whitespace-Zeichen:
[[:space:]]
und[[:blank:]]
:[[:blank:]]
bedeutet, space und tab. Dies macht es ähnlich:[ \t]
.[[:space:]]
neben Raum und Registerkarte enthält newline, linefeed, formfeed und vertikale Registerkarte. Dies macht es ähnlich:[ \t\n\r\f\v]
.Einer der wichtigsten Vorteile der Verwendung von Charakter-Klassen ist, dass Sie sicher sind für unicode-Schriftarten.
[:space:]
bedeutet, dass alle whitespace-Zeichen, einschließlich carriage returns und newlines während[:blank:]
bedeutet "horizontal" whitespace (Leerzeichen und Tabulatoren) -- regular-expressions.info/posixbrackets.htmlLoszuwerden, die eckigen Klammern im regulären Ausdruck:
Mit den eckigen Klammern vorhanden, die
\s
im inneren wird buchstäblich interpretiert als matching entweder die\
oders
Zeichen, aber Ihre Absicht ist klar-match gegen den white-space-Zeichen für welche Klasse\s
ist die Kurzform (und damit keine eckigen Klammern notwendig sind).regexp="templateUrl:\s*'"
noch echo "Nein" für mich.yes
für mich. Ich bin läuft auf einem Linux-Mint-17-box. Ich werde aktualisieren, die Antwort zu reflektieren als solche.Sollte dies funktionieren:
Wenn Sie wollen, um übereinstimmung mit null oder mehr Leerzeichen, die
*
muss Hinzugefügt nach[[:space:]]
.*
gebraucht zu sein scheint.GNU bash, version 4.2.25
es nicht gebraucht wird.*
ist erforderlich, wenn Sie möchten, um übereinstimmung mit null oder mehr Leerzeichen. Es ist nicht erforderlich, wenn Sie wollen-match - genau ein Leerzeichen.