Ich versuche, einen Wert aus einer langen Zeichenfolge zu extrahieren, die sich im Laufe der Zeit ändern kann. Der String könnte also zum Beispiel so aussehen
....../filename-1.9.0.3.tar.gz"<....
Und was ich extrahieren möchte, ist der Wert zwischen filename- und .tar.gz , im Wesentlichen die Dateiversion (in diesem Fall 1.9.0.3). Der Grund, warum ich es auf diese Weise tun muss, ist, dass ich später den Befehl ausführen könnte und der Wert 1.9.0.6 oder 2.0.0.2 oder etwas ganz anderes sein wird.
Wie kann ich das machen? Ich verwende derzeit nur grep, aber ich hätte nichts dagegen, andere Dienstprogramme wie sed oder awk oder cut oder was auch immer zu verwenden. Um es ganz klar zu sagen, ich muss nur den Teil der Dateiversion des Strings extrahieren, da er sehr lang ist (auf beiden Seiten), muss alles andere irgendwie ausgeschnitten werden.
Akzeptierte Antwort:
Mit grep -P /pcregrep , mit einem positiven Look-Behind und einem positiven Look-Ahead:
grep -P -o '(?<=STRING1).*?(?=STRING2)' infile
Ersetzen Sie in Ihrem Fall STRING1 mit filename- und STRING2 mit .tar.gz
Wenn Sie keinen Zugriff auf pcregrep haben und/oder wenn Ihr grep unterstützt -P nicht Sie können dies mit Ihrem bevorzugten Textverarbeitungsprogramm tun. Hier ist ein portabler Weg mit ed das gibt Ihnen die gleiche Ausgabe:
ed -s infile <<IN
g/STRING1/s//
&/g
v/STRING1.*STRING2/d
,s/STRING1//
,s/STRING2.*//
,p
IN
So funktioniert es:Jedem STRING1 wird ein Zeilenumbruch vorangestellt Vorkommen (also gibt es jetzt höchstens ein Vorkommen pro Zeile), dann alle Zeilen, die nicht mit STRING1.*STRING2 übereinstimmen werden gelöscht; bei den restlichen behalten wir nur das, was zwischen STRING1 steht und STRING2 und drucken Sie das Ergebnis aus.