חיפוש תבניות עם Grep ב- Java

1. סקירה כללית

במדריך זה - נלמד כיצד חפש תבנית בקובץ / ים נתון - שימוש בספריות Java וספריות צד שלישי כגון Unix4J ו- Grep4J.

2. רקע

ל- Unix יש פקודה חזקה שנקראת grep - שמייצג " - הדפסת ביטוי רגולרי גלובלי ". הוא מחפש את התבנית או ביטוי רגולרי בתוך קבוצת קבצים נתונה.

אפשר להשתמש באפס או יותר אפשרויות יחד עם הפקודה grep כדי להעשיר את תוצאת החיפוש אותה היינו בוחנים פרטים בסעיף הבא.

אם אתה משתמש ב- Windows, אתה יכול להתקין bash כאמור בפוסט כאן.

3. עם ספריית unix4j

ראשית, בואו נראה כיצד להשתמש בספריית Unix4J כדי לתפוס תבנית בקובץ.

בדוגמה הבאה - נבדוק כיצד לתרגם את פקודות ה- Unix grep בג'אווה.

3.1. תצורת בנייה

הוסף את התלות הבאה שלך ב- pom.xml אוֹ build.gradle:

 org.unix4j פקודת unix4j 0.4 

3.2. דוגמה עם גרפ

דוגמה ל- grep ב- Unix:

grep "NINETEEN" dictionary.txt 

המקבילה ב- Java היא:

@ מבחן ציבורי בטל כאשר GrepWithSimpleString_thenCorrect () {int expectedLineCount = 4; קובץ קובץ = קובץ חדש ("dictionary.txt"); שורות רשימה = Unix4j.grep ("NINETEEN", קובץ) .toLineList (); assertEquals (expectLineCount, lines.size ()); } 

דוגמה נוספת היא היכן שנוכל להשתמש בחיפוש טקסט הפוך בקובץ. הנה גרסת יוניקס של אותה:

grep -v "NINETEEN" dictionary.txt 

הנה גרסת Java של הפקודה הנ"ל:

@ מבחן ציבורי בטל כאשרInverseGrepWithSimpleString_thenCorrect () {int expectedLineCount = 178687; קובץ קובץ = קובץ חדש ("dictionary.txt"); שורות רשימה = Unix4j.grep (Grep.Options.v, "NINETEEN", קובץ). toLineList (); assertEquals (expectLineCount, lines.size ()); } 

בואו נראה איך נוכל להשתמש בביטוי רגולרי כדי לחפש תבנית בקובץ. הנה גרסת יוניקס כדי לספור את כל דפוס הביטוי הרגיל שנמצא בכל הקובץ:

grep -c ". *? תשע. *?" dictionary.txt 

הנה גרסת Java של הפקודה הנ"ל:

@Test ציבורי בטל כאשרGrepWithRegex_thenCorrect () {int expectLineCount = 151; קובץ קובץ = קובץ חדש ("dictionary.txt"); PatternCount מחרוזת = Unix4j.grep (Grep.Options.c, ". *? NINE. *?", קובץ). cut (CutOption.fields, ":", 1) .toStringResult (); assertEquals (expectLineCount, patternCount); }

4. עם Grep4J

לאחר מכן - בואו נראה כיצד להשתמש בספריית Grep4J כדי לתפוס תבנית בקובץ השוכן באופן מקומי או איפשהו במיקום מרוחק.

בדוגמה הבאה - נבדוק כיצד לתרגם את פקודות ה- Unix grep בג'אווה.

4.1. תצורת בנייה

הוסף את התלות הבאה שלך pom.xml אוֹ build.gradle:

 com.googlecode.grep4j grep4j 1.8.7 

4.2. דוגמאות לגריפ

דוגמה ל- grep ב- Java כלומר שווה ערך ל:

grep "NINETEEN" dictionary.txt 

הנה גרסת הפקודה של Java:

@Test הציבור בטל givenLocalFile_whenGrepWithSimpleString_thenCorrect () {int expectLineCount = 4; פרופיל localProfile = ProfileBuilder.newBuilder (). שם ("dictionary.txt"). filePath ("."). onLocalhost (). build (); תוצאות GrepResults = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), localProfile); assertEquals (expectLineCount, results.totalLines ()); } 

דוגמה נוספת היא היכן שנוכל להשתמש בחיפוש טקסט הפוך בקובץ. הנה גרסת יוניקס של אותה:

grep -v "NINETEEN" dictionary.txt 

והנה גרסת Java:

@Test public void givenRemoteFile_whenInverseGrepWithSimpleString_thenCorrect () {int expectedLineCount = 178687; פרופיל remoteProfile = ProfileBuilder.newBuilder (). שם ("dictionary.txt"). filePath ("."). filePath ("/ tmp / dictionary.txt"). onRemotehost ("172.168.192.1"). אישורים ("משתמש", "לעבור"). build (); תוצאות תוצאות של GrepResults = Grep4j.grep (Grep4j.constantExpression ("NINETEEN"), remoteProfile, Option.invertMatch ()); assertEquals (expectLineCount, results.totalLines ()); } 

בואו נראה איך נוכל להשתמש בביטוי רגולרי כדי לחפש תבנית בקובץ. הנה גרסת יוניקס כדי לספור את כל דפוס הביטוי הרגיל שנמצא בכל הקובץ:

grep -c ". *? תשע. *?" dictionary.txt 

הנה גרסת Java:

@Test הציבור בטל givenLocalFile_whenGrepWithRegex_thenCorrect () {int expectLineCount = 151; פרופיל localProfile = ProfileBuilder.newBuilder (). שם ("dictionary.txt"). filePath ("."). onLocalhost (). build (); תוצאות GrepResults = Grep4j.grep (Grep4j.regularExpression (". *? NINE. *?"), LocalProfile, Option.countMatches ()); assertEquals (expectLineCount, results.totalLines ()); }

5. מסקנה

במדריך מהיר זה, המחשנו חיפוש אחר תבנית בקובץ / ים נתון באמצעות Grep4j ו יוניקס 4 ג'י.

ניתן למצוא את היישום של דוגמאות אלה בפרויקט GitHub - זהו פרויקט מבוסס Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.

לבסוף, אתה יכול לעשות באופן טבעי חלק מהיסודות של פונקציונליות דמוית grep גם באמצעות פונקציונליות regex ב- JDK.


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