Ich möchte einen Teil einer Zeichenfolge extrahieren, der einem regulären Ausdruck entspricht. Betrachten Sie den folgenden Code, der ordnungsgemäß funktioniert:
regex="ss"
string="blossom"
echo $string | sed "s/^.*\($regex\).*$/\1/"
Die Ausgabe lautet:
ss
Wenn der reguläre Ausdruck jedoch nichts ergibt, wird die gesamte Zeichenfolge zurückgegeben.
regex="aa"
Ausgabe:
blossom
Das ist falsch. Wenn es keine Übereinstimmung gibt, sollte nichts zurückgegeben werden. Wie kann das erreicht werden?
Antwort1
Wie choroba sagte, druckt sed standardmäßig immer die Zeile mit allen passenden Ersetzungen. Sie können tun, was Sie wollen mit:
regex="ss"
string="blossom"
echo $string | sed -n "s/^.*\($regex\).*$/\1/p"
Das "-n" weist sed an, die Zeile nicht auszudrucken. Das "p" am Ende des "s/"-Befehls weist sed an, die Zeile mit Ersetzungen auszudrucken, sofern eine Übereinstimmung vorliegt.
Antwort2
Ihre Interpretation ist falsch. Sie sagten, sed
etwas durch etwas anderes zu ersetzen; wenn es nichts zum Ersetzen gefunden hat, warum sollte es dann etwas löschen? Mit anderen Worten, die Substitution ersetzt, was übereinstimmt, sie berührt nicht übereinstimmende Zeilen. Oder noch eine andere Umformulierung: sed ersetzte alle Zeilen, die enthielten, korrekt aa
durch aa
.
Antwort3
Das Verhalten von sed ist korrekt, es druckt die Eingabezeichenfolge EDITED aus. Wenn in der Eingabezeichenfolge offensichtlich nichts mit dem angegebenen Token übereinstimmt, ist das Ergebnis die Eingabezeichenfolge so, wie sie ist. Bei regex="aa" stimmt das ausgewertete Token nicht überein und es wird = "blossom" ausgedruckt.
Antwort4
Folgendes sollte funktionieren, wenn Sie auf die Verwendung von „sed“ verzichten möchten:
[[ $string == *$regex* ]] && echo $regex