GNU/Linux >> Znalost Linux >  >> Linux

Jak najít/grep, co je mezi String1 a String2?

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.


Linux
  1. Co je Makefile a jak funguje?

  2. Jaký je rozdíl mezi InnoDB a MyISAM?

  3. Co jsou zombie procesy a jak najít a zabít zombie procesy?

  1. Jak najít více řetězců v souborech?

  2. Rozdíl mezi '{}' a {} v příkazu find?

  3. Jaký je rozdíl mezi ls a l?

  1. Jak zjistit, kdo je přihlášen ve vašem systému a co dělá

  2. Jaký je rozdíl mezi příkazem locate a find v Linuxu

  3. Jaký je rozdíl mezi unlink a rm?