package javacodebook.regex.grep; import java.util.regex.*; import java.io.*; import javacodebook.io.dirtree.FileVisitor; /** * Abgewandeltes Grep. Die Klasse implementiert das Interface * FileVisitor aus dem Kapitel 4 und kann daher auf einem * Verzeichnisbaum angewendet werden. */ public class Grep implements FileVisitor { Pattern pattern; boolean lineNumbers = false; boolean fileOnly = false; /** * Erzeugt ein neues Grep-Objekt zum zeilenweisen Suchen * von Mustern in Texten * @param search Der zu suchende reguläre Ausdruck * @param ignoreCase soll die Suche case-sensitiv erfolgen? * @param lineNumber Gebe die Zeilennummer der gefundenen Zeile aus * @param fileOnly Gefundene Zeilen werden gar nicht ausgegeben, sondern nur * die Dateien, in denen das Muster erkannt wurde. */ public Grep(String search, boolean ignoreCase, boolean lineNumbers, boolean fileOnly) { if (ignoreCase == true) pattern = Pattern.compile(search, Pattern.CASE_INSENSITIVE); else pattern = Pattern.compile(search); this.lineNumbers = lineNumbers; this.fileOnly = fileOnly; } /** * Die eigentliche Suche. Sie kann auch mehrfach mit * verschiedenen Dateien erfolgen */ public void visitFile(File f) throws IOException { boolean found = false; // Reader zum zeilenweisen Lesen der Datei erzeugen. BufferedReader in = new BufferedReader( new FileReader(f)); String inputLine; Matcher matcher; int lineNumber = 0; // Datei zeilenweise auslesen while ((inputLine = in.readLine()) != null) { // Zeilennummer tracken lineNumber++; // Enthält die Zeile das Suchmuster? if (pattern.matcher(inputLine).find()) { // Je nach Konfiguration das Ergebnis ausgeben. if (!found) System.out.println(f.toString()); found = true; if (lineNumbers && !fileOnly) System.out.print(lineNumber + " "); if (!fileOnly) System.out.println(inputLine); } } in.close(); } public void visitDirectory(File f) throws IOException { } } --- Neue Klasse --- package javacodebook.regex.grep; import java.io.*; import javacodebook.io.dirtree.*; /** * Sucht in einer Datei nach einem Suchmuster. Sowohl das * Suchmuster als auch die Datei müssen als Übergabeparameter * definiert werden. */ public class Starter { public static void main(String[] args) throws IOException { if (args.length < 2) printUsage(); // Suchmuster und Datei aus den Parametern lesen String pattern = args[0]; String filename = args[1]; // Ein Objekt von Grep sowie der zu durchsuchenden Datei erzeugen Grep grep = new Grep(pattern, false, true, false); File file = new File(filename); // Datei jetzt untersuchen grep.visitFile(file); } private static void printUsage() { System.out.println("Aufruf: java javacodebook.regex.grep.Starter "); System.exit(0); } }