Pencarian Corak dengan Grep di Jawa

1. Gambaran keseluruhan

Dalam tutorial ini - kita akan belajar bagaimana mencari corak dalam fail tertentu - menggunakan Java dan perpustakaan pihak ketiga seperti Unix4J dan Grep4J.

2. Latar belakang

Unix mempunyai perintah kuat yang disebut grep - yang bermaksud " cetakan ekspresi biasa global ". Ia mencari corak atau ungkapan biasa dalam sekumpulan fail tertentu.

Seseorang boleh menggunakan pilihan sifar atau lebih bersama dengan perintah grep untuk memperkaya hasil carian yang mana kita akan melihat perinciannya di bahagian yang akan datang.

Sekiranya anda menggunakan Windows, anda boleh memasang bash seperti yang dinyatakan dalam catatan di sini.

3. Dengan Perpustakaan unix4j

Pertama, mari kita lihat bagaimana menggunakan pustaka Unix4J untuk memberi corak dalam fail.

Dalam contoh berikut - kita akan melihat bagaimana menerjemahkan perintah greix Unix di Java.

3.1. Bina Konfigurasi

Tambahkan kebergantungan berikut pada pom.xml atau build.gradle anda :

 org.unix4j unix4j-command 0.4 

3.2. Contoh dengan Grep

Contoh grep dalam Unix:

grep "NINETEEN" dictionary.txt 

Setaraf di Jawa adalah:

@Test public void whenGrepWithSimpleString_thenCorrect() { int expectedLineCount = 4; File file = new File("dictionary.txt"); List lines = Unix4j.grep("NINETEEN", file).toLineList(); assertEquals(expectedLineCount, lines.size()); } 

Contoh lain adalah di mana kita boleh menggunakan carian teks terbalik dalam fail. Inilah versi Unix yang sama:

grep -v "NINETEEN" dictionary.txt 

Berikut arahan versi Java di atas:

@Test public void whenInverseGrepWithSimpleString_thenCorrect() { int expectedLineCount = 178687; File file = new File("dictionary.txt"); List lines = Unix4j.grep(Grep.Options.v, "NINETEEN", file). toLineList(); assertEquals(expectedLineCount, lines.size()); } 

Mari kita lihat, bagaimana kita dapat menggunakan ungkapan biasa untuk mencari corak dalam fail. Inilah versi Unix untuk mengira semua corak ungkapan biasa yang terdapat dalam keseluruhan fail:

grep -c ".*?NINE.*?" dictionary.txt 

Berikut arahan versi Java di atas:

@Test public void whenGrepWithRegex_thenCorrect() { int expectedLineCount = 151; File file = new File("dictionary.txt"); String patternCount = Unix4j.grep(Grep.Options.c, ".*?NINE.*?", file). cut(CutOption.fields, ":", 1).toStringResult(); assertEquals(expectedLineCount, patternCount); }

4. Dengan Grep4J

Seterusnya - mari kita lihat bagaimana menggunakan perpustakaan Grep4J untuk menarik corak dalam fail yang berada di dalam atau di tempat terpencil.

Dalam contoh berikut - kita akan melihat bagaimana menerjemahkan perintah greix Unix di Java.

4.1. Bina Konfigurasi

Tambahkan kebergantungan berikut pada pom.xml atau build.gradle anda :

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Contoh Grep

Contoh grep di Java iaitu setara dengan:

grep "NINETEEN" dictionary.txt 

Berikut adalah arahan versi Java:

@Test public void givenLocalFile_whenGrepWithSimpleString_thenCorrect() { int expectedLineCount = 4; Profile localProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). onLocalhost().build(); GrepResults results = Grep4j.grep(Grep4j.constantExpression("NINETEEN"), localProfile); assertEquals(expectedLineCount, results.totalLines()); } 

Contoh lain adalah di mana kita boleh menggunakan carian teks terbalik dalam fail. Inilah versi Unix yang sama:

grep -v "NINETEEN" dictionary.txt 

Dan inilah versi Java:

@Test public void givenRemoteFile_whenInverseGrepWithSimpleString_thenCorrect() { int expectedLineCount = 178687; Profile remoteProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). filePath("/tmp/dictionary.txt"). onRemotehost("172.168.192.1"). credentials("user", "pass").build(); GrepResults results = Grep4j.grep( Grep4j.constantExpression("NINETEEN"), remoteProfile, Option.invertMatch()); assertEquals(expectedLineCount, results.totalLines()); } 

Mari kita lihat, bagaimana kita dapat menggunakan ungkapan biasa untuk mencari corak dalam fail. Inilah versi Unix untuk mengira semua corak ungkapan biasa yang terdapat dalam keseluruhan fail:

grep -c ".*?NINE.*?" dictionary.txt 

Inilah versi Java:

@Test public void givenLocalFile_whenGrepWithRegex_thenCorrect() { int expectedLineCount = 151; Profile localProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). onLocalhost().build(); GrepResults results = Grep4j.grep( Grep4j.regularExpression(".*?NINE.*?"), localProfile, Option.countMatches()); assertEquals(expectedLineCount, results.totalLines()); }

5. Kesimpulan

Dalam tutorial ringkas ini, kami menggambarkan mencari pola dalam fail tertentu menggunakan Grep4j dan Unix4J .

Pelaksanaan contoh-contoh ini dapat dijumpai dalam projek GitHub - ini adalah projek berasaskan Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.

Akhirnya, anda secara semula jadi dapat melakukan beberapa asas fungsi seperti grep menggunakan fungsi regex di JDK juga.