1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 05:47:35 +00:00

sed: Allows the usage of escaped delimiters

This allows us to parse the sed script `s/\//S/g` successful.
This commit is contained in:
Fabian Dellwing 2023-06-12 15:10:38 +02:00 committed by Jelle Raaijmakers
parent b10c87d31e
commit 79d3942012

View file

@ -261,14 +261,25 @@ struct SArguments {
if (delimiter == '\n' || delimiter == '\\') if (delimiter == '\n' || delimiter == '\\')
return SedError::parsing_error(lexer, "\\n and \\ cannot be used as delimiters."sv); 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()) if (pattern.is_empty())
return SedError::parsing_error(lexer, "Substitution patterns cannot be empty."sv); return SedError::parsing_error(lexer, "Substitution patterns cannot be empty."sv);
if (!lexer.consume_specific(delimiter)) if (!lexer.consume_specific(delimiter))
return SedError::parsing_error(lexer, generic_error_message); 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. // According to Posix, "s/x/y" is an invalid substitution command.
// It must have a closing delimiter: "s/x/y/" // It must have a closing delimiter: "s/x/y/"