Estoy tratando de extraer un valor de una cadena larga que puede cambiar con el tiempo. Entonces, por ejemplo, la cadena podría verse así
....../filename-1.9.0.3.tar.gz"<....
Y lo que quiero extraer es el valor entre filename- y .tar.gz , esencialmente la versión del archivo (1.9.0.3 en este caso). La razón por la que necesito hacerlo de esta manera es porque más tarde puedo ejecutar el comando y el valor será 1.9.0.6 o 2.0.0.2 o algo completamente diferente.
¿Cómo puedo hacer esto? Actualmente solo estoy usando grep, pero no me importaría usar otras utilidades como sed o awk o cut o lo que sea. Para que quede perfectamente claro, necesito extraer solo la parte de la versión del archivo de la cadena, ya que es muy larga (en ambos lados), todo lo demás debe cortarse de alguna manera.
Respuesta aceptada:
Con grep -P
/pcregrep
, utilizando una mirada positiva hacia atrás y una mirada positiva hacia adelante:
grep -P -o '(?<=STRING1).*?(?=STRING2)' infile
en su caso, reemplace STRING1
con filename-
y STRING2
con .tar.gz
Si no tiene acceso a pcregrep
y/o si su grep
no es compatible con -P
puede hacerlo con su herramienta de procesamiento de texto favorita. Aquí hay una forma portátil con ed
eso te da el mismo resultado:
ed -s infile <<IN
g/STRING1/s//
&/g
v/STRING1.*STRING2/d
,s/STRING1//
,s/STRING2.*//
,p
IN
Cómo funciona:se antepone una nueva línea a cada STRING1
ocurrencia (así que ahora hay como máximo una ocurrencia por línea) entonces todas las líneas no coinciden con STRING1.*STRING2
se eliminan; en los restantes solo conservamos lo que hay entre STRING1
y STRING2
e imprime el resultado.