GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie finde/grep was zwischen String1 und String2 ist?

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.


Linux
  1. Was ist ein Makefile und wie funktioniert es?

  2. Was ist der Unterschied zwischen InnoDB und MyISAM?

  3. Was sind Zombie-Prozesse und wie findet und tötet man Zombie-Prozesse?

  4. Was ist der Unterschied zwischen dem Befehl „locate“ und „find“ in Linux?

  5. Unterschied zwischen '{}' und {} im Find-Befehl?

So finden Sie den Unterschied zwischen zwei Verzeichnissen mit Diff- und Meld-Tools

So finden Sie eine bestimmte Zeichenfolge oder ein bestimmtes Wort in Dateien und Verzeichnissen

Was ist UID in Linux, wie man es findet und ändert

So finden Sie eine Zeichenfolge in einer Datei unter Linux

Was ist EasyApache und wie verwende ich es?

Was ist der Grep-Befehl unter Linux? Warum wird es verwendet und wie funktioniert es?