Sto cercando di estrarre un valore da una lunga stringa che potrebbe cambiare nel tempo. Quindi, ad esempio, la stringa potrebbe assomigliare a questa
....../filename-1.9.0.3.tar.gz"<....
E quello che voglio estrarre è il valore tra nomefile- e .tar.gz , essenzialmente la versione del file (1.9.0.3 in questo caso). Il motivo per cui devo farlo in questo modo è perché in seguito potrei eseguire il comando e il valore sarà 1.9.0.6 o 2.0.0.2 o qualcosa di completamente diverso.
Come posso fare questo? Attualmente sto usando solo grep, ma non mi dispiacerebbe usare altre utilità come sed o awk o cut o altro. Per essere perfettamente chiaro, devo estrarre solo la parte della versione del file della stringa, poiché è molto lunga (su entrambi i lati) tutto il resto deve essere ritagliato in qualche modo.
Risposta accettata:
Con grep -P
/pcregrep
, utilizzando un look-behind positivo e uno sguardo al futuro positivo:
grep -P -o '(?<=STRING1).*?(?=STRING2)' infile
nel tuo caso sostituisci STRING1
con filename-
e STRING2
con .tar.gz
Se non hai accesso a pcregrep
e/o se il tuo grep
non supporta -P
puoi farlo con il tuo strumento di elaborazione del testo preferito. Ecco un modo portatile con ed
che ti dà lo stesso output:
ed -s infile <<IN
g/STRING1/s//
&/g
v/STRING1.*STRING2/d
,s/STRING1//
,s/STRING2.*//
,p
IN
Come funziona:a ogni STRING1
viene anteposta una nuova riga occorrenza (quindi ora c'è al massimo un'occorrenza per riga), quindi tutte le righe che non corrispondono a STRING1.*STRING2
vengono cancellati; sui restanti conserviamo solo ciò che è compreso tra STRING1
e STRING2
e stampa il risultato.