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.