From 258a3b27ac7cf900edd7ececcddaa4a2befb00aa Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Sat, 23 Jan 2021 22:11:19 -0700 Subject: [PATCH] Userland: Implement grep -v (invert-match) This will make grep output every line that doesn't have any matches of the given regular expression --- Userland/Utilities/grep.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Userland/Utilities/grep.cpp b/Userland/Utilities/grep.cpp index 8022fc487c..fb68753327 100644 --- a/Userland/Utilities/grep.cpp +++ b/Userland/Utilities/grep.cpp @@ -65,12 +65,14 @@ int main(int argc, char** argv) const char* pattern = nullptr; BinaryFileMode binary_mode { BinaryFileMode::Binary }; bool case_insensitive = false; + bool invert_match = false; Core::ArgsParser args_parser; args_parser.add_option(recursive, "Recursively scan files starting in working directory", "recursive", 'r'); args_parser.add_option(use_ere, "Extended regular expressions (default)", "extended-regexp", 'E'); args_parser.add_option(pattern, "Pattern", "regexp", 'e', "Pattern"); args_parser.add_option(case_insensitive, "Make matches case-insensitive", nullptr, 'i'); + args_parser.add_option(invert_match, "Select non-matching lines", "invert-match", 'v'); args_parser.add_option(Core::ArgsParser::Option { .requires_argument = true, .help_string = "Action to take for binary files ([binary], text, skip)", @@ -132,11 +134,11 @@ int main(int argc, char** argv) return false; auto result = re.match(str, PosixFlags::Global); - if (result.success) { + if (result.success ^ invert_match) { if (is_binary && binary_mode == BinaryFileMode::Binary) { outln("binary file \x1B[34m{}\x1B[0m matches", filename); } else { - if (result.matches.size() && print_filename) { + if ((result.matches.size() || invert_match) && print_filename) { out("\x1B[34m{}:\x1B[0m", filename); }