Pretraživanje uzoraka pomoću Grepa na Javi

1. Pregled

U ovom uputstvu naučit ćemo kako potražite obrazac u datoj datoteci / datotekama - koristeći Java i biblioteke trećih strana kao što su Unix4J i Grep4J.

2. Pozadina

Unix ima moćnu naredbu tzv grep - što znači " ispis globalnog regularnog izraza “. Traži obrazac ili regularni izraz unutar zadanog skupa datoteka.

Možete upotrijebiti nula ili više opcija zajedno s grep naredbom za obogaćivanje rezultata pretraživanja koje bismo detaljno pogledali u narednom odjeljku.

Ako koristite Windows, možete instalirati bash kako je spomenuto u ovom postu.

3. S bibliotekom unix4j

Prvo, pogledajmo kako koristiti Unix4J knjižnicu za grepanje uzorka u datoteci.

U sljedećem primjeru - pogledati ćemo kako prevesti Unix grep naredbe u Javi.

3.1. Konfiguracija gradnje

Dodajte sljedeću ovisnost o vašem pom.xml ili graditi.gradle:

 org.unix4j unix4j-naredba 0.4 

3.2. Primjer s Grepom

Primjer grepa u Unixu:

grep "NINETEEN" rječnik.txt 

Ekvivalent u Javi je:

@Test javna praznina kadaGrepWithSimpleString_thenCorrect () {int očekujeLineCount = 4; Datoteka datoteke = nova datoteka ("dictionary.txt"); Redovi popisa = Unix4j.grep ("NINETEEN", datoteka) .toLineList (); assertEquals (očekuje seLineCount, lines.size ()); } 

Drugi je primjer gdje možemo koristiti inverzno pretraživanje teksta u datoteci. Evo iste verzije Unixa:

grep -v "NINETEEN" rječnik.txt 

Evo Java verzije gore navedene naredbe:

@Test javna praznina kadaInverseGrepWithSimpleString_thenCorrect () {int očekuje seLineCount = 178687; Datoteka datoteke = nova datoteka ("dictionary.txt"); Redovi popisa = Unix4j.grep (Grep.Options.v, "NINETEEN", datoteka). toLineList (); assertEquals (očekuje seLineCount, lines.size ()); } 

Pogledajmo kako možemo koristiti regularni izraz za traženje uzorka u datoteci. Evo Unix verzije za brojanje svih obrazaca regularnih izraza pronađenih u cijeloj datoteci:

grep -c ". *? NINE. *?" rječnik.txt 

Evo Java verzije gore navedene naredbe:

@Test javna praznina kadaGrepWithRegex_thenCorrect () {int očekuje seLineCount = 151; Datoteka datoteke = nova datoteka ("dictionary.txt"); Niz uzorkaCount = Unix4j.grep (Grep.Options.c, ". *? NINE. *?", Datoteka). izrezati (CutOption.fields, ":", 1) .toStringResult (); assertEquals (očekivaniLineCount, patternCount); }

4. Uz Grep4J

Dalje - pogledajmo kako koristiti biblioteku Grep4J za grepanje uzorka u datoteci koja se nalazi lokalno ili negdje na udaljenom mjestu.

U sljedećem primjeru - pogledati ćemo kako prevesti Unix grep naredbe u Javi.

4.1. Konfiguracija gradnje

Dodajte sljedeću ovisnost o vašem pom.xml ili graditi.gradle:

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Primjeri Grepa

Uzorak grepa u Javi, tj. Ekvivalent:

grep "NINETEEN" rječnik.txt 

Evo Java verzije naredbe:

@Test javna praznina givenLocalFile_whenGrepWithSimpleString_thenCorrect () {int očekujeLineCount = 4; Profil localProfile = ProfileBuilder.newBuilder (). ime ("dictionary.txt"). filePath ("."). onLocalhost (). build (); Rezultati GrepResults = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), localProfile); assertEquals (očekuje seLineCount, results.totalLines ()); } 

Drugi je primjer gdje možemo koristiti inverzno pretraživanje teksta u datoteci. Evo iste verzije Unixa:

grep -v "NINETEEN" rječnik.txt 

I evo Java verzije:

@Test javna praznina givenRemoteFile_whenInverseGrepWithSimpleString_thenCorrect () {int očekujeLineCount = 178687; Profil remoteProfile = ProfileBuilder.newBuilder (). ime ("dictionary.txt"). filePath ("."). filePath ("/ tmp / dictionary.txt"). onRemotehost ("172.168.192.1"). vjerodajnice ("user", "pass"). build (); Rezultati GrepResults = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), remoteProfile, Option.invertMatch ()); assertEquals (očekuje seLineCount, results.totalLines ()); } 

Pogledajmo kako možemo koristiti regularni izraz za traženje uzorka u datoteci. Evo Unix verzije za brojanje svih obrazaca regularnih izraza pronađenih u cijeloj datoteci:

grep -c ". *? NINE. *?" rječnik.txt 

Evo Java verzije:

@Test javna praznina givenLocalFile_whenGrepWithRegex_thenCorrect () {int očekujeLineCount = 151; Profil localProfile = ProfileBuilder.newBuilder (). ime ("dictionary.txt"). filePath ("."). onLocalhost (). build (); Rezultati GrepResults = Grep4j.grep (Grep4j.regularExpression (". *? NINE. *?"), LocalProfile, Option.countMatches ()); assertEquals (očekuje seLineCount, results.totalLines ()); }

5. Zaključak

U ovom smo brzom vodiču ilustrirali traženje uzorka u datoj datoteci / datotekama pomoću Grep4j i Unix4J.

Implementacija ovih primjera može se naći u projektu GitHub - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.

Napokon, možete prirodno napraviti neke od osnova grep-slične funkcionalnosti koristeći i regex funkcionalnost u JDK.


$config[zx-auto] not found$config[zx-overlay] not found