Ich habe zum Beispiel eine Zeichenfolge
"Icecream123 AirplaneBCD CompanyTL1 ComputerYU1"
Angenommen, ich weiß, dass meine Zeichenfolge mit Sicherheit den Teilstring IceCream enthält, aber ich weiß nicht, was darauf folgt.
Es könnte 123 sein wie in meinem Beispiel oder es könnte etwas anderes sein.
Während ich mit grep feststellen kann, ob in meiner Zeichenfolge mit dem folgenden Befehl "Icecream" -Substring vorhanden ist
echo $string | grep -oF 'Icecream';
Welches wird gedruckt
Icecream
Ich möchte mit einem Befehl den gesamten Teilstring drucken, der in meinem Beispiel ist
Icecream123
Natürlich ist das, was Icecream folgt, zufällig und vorher nicht bekannt, also kann ich es nicht einfach tun
$SUBSTRING=$(echo $string | grep -oF 'Icecream')
$SUBSTRINGTRAIL=123
echo $SUBSTRING$SUBSTRINGTRAIL
bash
shell-script
grep
Sonamor
quelle
quelle
Icecream123 AirplaneBCD
du willst zum Beispiel anhalten123
. Liegt das daran, dass nach der 3 ein Leerzeichen steht oder etwas anderes?Antworten:
Wenn Sie
grep
Perl-kompatible reguläre Ausdrücke unterstützen, können Sie nicht gierig bis zur nächsten Wortgrenze übereinstimmen:Andernfalls stimmen Sie mit der längsten Folge von nicht leeren Zeichen überein:
Oder behalten Sie alles in der Shell und entfernen Sie die längste nachfolgende Zeichenfolge, beginnend mit einem Leerzeichen:
quelle
'Icecream\S+'
einige nicht leere Zeichen verwenden.Mit einem
grep
, der weiß über-o
:Das Muster
\<Icecream[^[:blank:]]*
entspricht der ZeichenfolgeIcecream
(I
vor der ein Nicht-Wort-Zeichen oder der Zeilenanfang steht), gefolgt von null oder mehr Nicht-Leerzeichen (keine Leerzeichen oder Tabulatoren).Verwenden von
awk
:Das
awk
Programm unterteilt die Zeichenfolge in durch Leerzeichen getrennte Datensätze und testet jeden einzelnen. Es werden diejenigen gedruckt, die mit der Zeichenfolge beginnenIcecream
.Mit
mawk
oder GNUawk
können Sie auch verwendenda sie
RS
als regulärer Ausdruck interpetieren, wenn er mehr als ein Zeichen enthält.Mit
sed
, ähnlich wie mitgrep
:Verwenden von
/bin/sh
:Perl (mit ein wenig Hilfe von
tr
):oder nur
quelle
echo "$string" | grep -o '\S\+' | grep "Icecream"
Seit du bash getaggt hast:
Allgemeiner für einen Suchbegriff in
$search
:... oder mit Parametererweiterung:
quelle
Zum Beispiel, wenn Sie verwenden
GNU grep
:Es verwendet
PCRE
.quelle
Ein bisschen einfacher vielleicht, zumal Sie sagen, dass Ihre Version von grep Perl Regex nicht unterstützt:
$ echo $string | tr ' ' '\n' | grep 'Icecream' Icecream123
Das
tr
teilt die Zeichenfolge in Zeilen auf, indem alle Leerzeichen durch Zeilenumbrüche ersetzt werden. Dann können Siegrep
leicht verwenden.Sie können auch Folgendes schreiben, um nur das zu erhalten, was dem gesuchten Wort folgt:
$ echo $string | tr ' ' '\n' | sed -n 's/Icecream//p' 123
quelle