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.