Verwenden von Regex in der if-Klausel in bash


10

Schauen Sie sich diesen if-Block an:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

Dies sollte "übereinstimmend" drucken, tut es aber nicht. Wo gehe ich falsch?

Antworten:


21

Sie müssen das Zitat in der Regex-Übereinstimmung entfernen.

if [[ ${str} =~ m\.m ]]; then

Von der Bash-Manpage:

[...] Ein zusätzlicher binärer Operator = ~ ist verfügbar, mit der gleichen Priorität wie == und! =. Bei Verwendung wird die Zeichenfolge rechts vom Operator als erweiterter regulärer Ausdruck betrachtet und entsprechend angepasst (wie in Regex (3)). Der Rückgabewert ist 0, wenn die Zeichenfolge mit dem Muster übereinstimmt, andernfalls 1. Wenn der reguläre Ausdruck syntaktisch falsch ist, beträgt der Rückgabewert des bedingten Ausdrucks 2. Wenn die Shell-Option nocasematch aktiviert ist, wird die Übereinstimmung ohne Berücksichtigung des Falls von alphabetischen Zeichen durchgeführt. Jeder Teil des Musters kann in Anführungszeichen gesetzt werden, um zu erzwingen, dass es als Zeichenfolge abgeglichen wird.

Bei den Anführungszeichen verwenden Sie also einen guten alten String-Abgleich.

Wenn Sie Leerzeichen im Muster benötigen, maskieren Sie diese einfach:

str="m   m"
if [[ ${str} =~ m\ +m ]]; then

Ohne doppeltes Anführungszeichen können wir jedoch kein Leerzeichen im Regex-Muster verwenden. Gibt es dafür eine Lösung?
Majid Azimi

1
Raum sollte wie entkommen \ .
19 МАЛИКОВ

Wenn ich einen String finden möchte, der mit einer dynamischen Zahl endet, ${str} =~ "needle"[0-9]{1}sollte ich verwenden oder sollte ich verwenden ${str} =~ needle[0-9]{1}?
mgutt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.