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.