GNU/Linux >> Tutoriels Linux >  >> Linux

Comment trouver/grep ce qu'il y a entre String1 et String2 ?

J'essaie d'extraire une valeur d'une longue chaîne qui peut changer avec le temps. Ainsi, par exemple, la chaîne pourrait ressembler à ceci

....../filename-1.9.0.3.tar.gz"<....

Et ce que je veux extraire est la valeur entre filename- et .tar.gz , essentiellement la version du fichier (1.9.0.3 dans ce cas). La raison pour laquelle je dois le faire de cette façon est que je pourrais exécuter la commande plus tard et la valeur sera 1.9.0.6 ou 2.0.0.2 ou quelque chose de complètement différent.

Comment puis-je faire ceci? Je n'utilise actuellement que grep, mais cela ne me dérangerait pas d'utiliser d'autres utilitaires tels que sed ou awk ou cut ou autre. Pour être parfaitement clair, je n'ai besoin d'extraire que la partie version du fichier de la chaîne, car elle est très longue (des deux côtés), tout le reste doit être coupé d'une manière ou d'une autre.

Réponse acceptée :

Avec grep -P /pcregrep , en utilisant un regard en arrière positif et un regard en avant positif :

grep -P -o '(?<=STRING1).*?(?=STRING2)' infile

dans votre cas, remplacez STRING1 avec filename- et STRING2 avec .tar.gz

Si vous n'avez pas accès à pcregrep et/ou si votre grep ne prend pas en charge -P vous pouvez le faire avec votre outil de traitement de texte préféré. Voici un moyen portable avec ed qui vous donne le même résultat :

ed -s infile <<IN
g/STRING1/s// 
&/g
v/STRING1.*STRING2/d
,s/STRING1//
,s/STRING2.*//
,p
IN

Comment ça marche :une nouvelle ligne est ajoutée à chaque STRING1 occurrence (donc maintenant il y a au plus une occurrence par ligne) puis toutes les lignes ne correspondant pas à STRING1.*STRING2 sont supprimés ; sur les autres, nous ne gardons que ce qui est entre STRING1 et STRING2 et imprimez le résultat.


Linux
  1. Qu'est-ce qu'un Makefile et comment ça marche ?

  2. Quelle est la différence entre InnoDB et MyISAM ?

  3. Quelle est la différence entre la commande locate et find sous Linux

  4. Comment combiner find et grep pour une recherche complexe ? ( GNU/linux, trouver, grep )

  5. Différence entre '{}' et {} dans la commande find ?

Comment trouver la différence entre deux répertoires à l'aide des outils Diff et Meld

Comment trouver une chaîne ou un mot spécifique dans les fichiers et les répertoires

Qu'est-ce que l'UID sous Linux, comment le trouver et le modifier

Comment trouver une chaîne dans un fichier sous Linux

Qu'est-ce qu'EasyApache et comment l'utiliser ?

Qu'est-ce que la commande Grep sous Linux ? Pourquoi est-il utilisé et comment fonctionne-t-il ?