From 79d3942012a84d7c998e5674a5e7c0bcb8cb06f0 Mon Sep 17 00:00:00 2001 From: Fabian Dellwing Date: Mon, 12 Jun 2023 15:10:38 +0200 Subject: [PATCH] sed: Allows the usage of escaped delimiters This allows us to parse the sed script `s/\//S/g` successful. --- Userland/Utilities/sed.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Userland/Utilities/sed.cpp b/Userland/Utilities/sed.cpp index b84d156289..9fa280c1a1 100644 --- a/Userland/Utilities/sed.cpp +++ b/Userland/Utilities/sed.cpp @@ -261,14 +261,25 @@ struct SArguments { if (delimiter == '\n' || delimiter == '\\') return SedError::parsing_error(lexer, "\\n and \\ cannot be used as delimiters."sv); - auto pattern = lexer.consume_until(delimiter); + auto pattern = lexer.consume_until([is_escape_sequence = false, delimiter](char c) mutable { + if (c == delimiter && !is_escape_sequence) + return true; + is_escape_sequence = c == '\\' && !is_escape_sequence; + return false; + }); + if (pattern.is_empty()) return SedError::parsing_error(lexer, "Substitution patterns cannot be empty."sv); if (!lexer.consume_specific(delimiter)) return SedError::parsing_error(lexer, generic_error_message); - auto replacement = lexer.consume_until(delimiter); + auto replacement = lexer.consume_until([is_escape_sequence = false, delimiter](char c) mutable { + if (c == delimiter && !is_escape_sequence) + return true; + is_escape_sequence = c == '\\' && !is_escape_sequence; + return false; + }); // According to Posix, "s/x/y" is an invalid substitution command. // It must have a closing delimiter: "s/x/y/"