Snažím se extrahovat hodnotu z dlouhého řetězce, který se může časem měnit. Řetězec by tedy mohl vypadat například takto
....../filename-1.9.0.3.tar.gz"<....
A co chci extrahovat, je hodnota mezi filename- a .tar.gz , v podstatě verzi souboru (v tomto případě 1.9.0.3). Důvod, proč to musím udělat tímto způsobem, je ten, že mohu později spustit příkaz a hodnota bude 1.9.0.6 nebo 2.0.0.2 nebo něco úplně jiného.
Jak to mohu udělat? Momentálně používám pouze grep, ale nevadilo by mi používat další nástroje, jako je sed nebo awk nebo cut nebo cokoli jiného. Aby bylo jasno, potřebuji extrahovat pouze část řetězce verze souboru, protože je velmi dlouhý (na obou stranách), vše ostatní je třeba nějak vystřihnout.
Přijatá odpověď:
Pomocí grep -P
/pcregrep
, pomocí pozitivního pohledu na pozadí a pozitivního pohledu dopředu:
grep -P -o '(?<=STRING1).*?(?=STRING2)' infile
ve vašem případě nahraďte STRING1
s filename-
a STRING2
s .tar.gz
Pokud nemáte přístup k pcregrep
a/nebo pokud váš grep
nepodporuje -P
můžete to udělat pomocí svého oblíbeného nástroje pro zpracování textu. Zde je přenosný způsob s ed
což vám dává stejný výstup:
ed -s infile <<IN
g/STRING1/s//
&/g
v/STRING1.*STRING2/d
,s/STRING1//
,s/STRING2.*//
,p
IN
Jak to funguje:před každý STRING1
se přidá nový řádek výskyt (takže nyní je maximálně jeden výskyt na řádek), potom všechny řádky, které neodpovídají STRING1.*STRING2
jsou vymazány; na zbývajících ponecháme pouze to, co je mezi STRING1
a STRING2
a vytiskněte výsledek.