|
|
|
|
|
|
10
|
class GrepTool {
|
10
|
class GrepTool {
|
|
11
|
|
11
|
|
|
12
|
String grep(String pattern, List<String> flags, List<String> files) {
|
12
|
String grep(String pattern, List<String> flags, List<String> files) {
|
|
13
|
- boolean shouldAddFilename = files.size() > 1;
|
|
|
|
|
|
13
|
+ boolean shouldAddFilenameToEachLine = files.size() > 1;
|
|
14
|
return files
|
14
|
return files
|
|
15
|
.stream()
|
15
|
.stream()
|
|
16
|
- .map(file -> grepFile(pattern, flags, file, shouldAddFilename))
|
|
|
|
|
|
16
|
+ .map(file -> grepFile(pattern, flags, file, shouldAddFilenameToEachLine))
|
|
17
|
.filter(line -> !line.isEmpty())
|
17
|
.filter(line -> !line.isEmpty())
|
|
18
|
.collect(Collectors.joining("\n"));
|
18
|
.collect(Collectors.joining("\n"));
|
|
19
|
}
|
19
|
}
|
|
20
|
|
20
|
|
|
21
|
- private String grepFile(String pattern, List<String> flags, String filename, boolean shouldAddFilename) {
|
|
|
|
|
|
21
|
+ private String grepFile(String pattern, List<String> flags, String filename, boolean shouldAddFilenameToEachLine) {
|
|
22
|
List<String> lines = readFile(filename);
|
22
|
List<String> lines = readFile(filename);
|
|
|
|
23
|
+
|
|
23
|
String matchingLines = IntStream.range(0, lines.size())
|
24
|
String matchingLines = IntStream.range(0, lines.size())
|
|
24
|
.filter(lineIndex -> lineMatchesPattern(lines.get(lineIndex), pattern, flags))
|
25
|
.filter(lineIndex -> lineMatchesPattern(lines.get(lineIndex), pattern, flags))
|
|
25
|
- .mapToObj(lineIndex -> applyFlagsToLine(lines.get(lineIndex), flags, lineIndex + 1))
|
|
|
|
26
|
- .map(line -> shouldAddFilename ? filename + ":" + line : line)
|
|
|
|
|
|
26
|
+ .mapToObj(lineIndex -> {
|
|
|
|
27
|
+ String lineWithFlagsApplied = applyFlagsToLine(lines.get(lineIndex), flags, lineIndex + 1);
|
|
|
|
28
|
+ return shouldAddFilenameToEachLine ? filename + ":" + lineWithFlagsApplied : lineWithFlagsApplied;
|
|
|
|
29
|
+ })
|
|
27
|
.collect(Collectors.joining("\n"));
|
30
|
.collect(Collectors.joining("\n"));
|
|
28
|
|
31
|
|
|
29
|
- boolean shouldPrintFilenames = flags.contains("-l");
|
|
|
|
30
|
- return shouldPrintFilenames && !matchingLines.isEmpty() ? filename : matchingLines;
|
|
|
|
|
|
32
|
+ boolean shouldPrintFilenameInsteadOfMatchingLines = flags.contains("-l");
|
|
|
|
33
|
+ return shouldPrintFilenameInsteadOfMatchingLines && !matchingLines.isEmpty() ? filename : matchingLines;
|
|
31
|
}
|
34
|
}
|
|
32
|
|
35
|
|
|
33
|
private boolean lineMatchesPattern(String line, String pattern, List<String> flags) {
|
36
|
private boolean lineMatchesPattern(String line, String pattern, List<String> flags) {
|