mirror of
https://github.com/RGBCube/serenity
synced 2025-07-28 01:47:34 +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:
parent
b10c87d31e
commit
79d3942012
1 changed files with 13 additions and 2 deletions
|
@ -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/"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue