diff --git a/src/matcher.rs b/src/matcher.rs index 783d239..6da6d9b 100644 --- a/src/matcher.rs +++ b/src/matcher.rs @@ -269,6 +269,10 @@ impl CompiledPattern { // GNU grep supports `{,n}` as an alias for `{0,n}`. syntax.enable_behavior(SyntaxBehavior::SYNTAX_BEHAVIOR_ALLOW_INTERVAL_LOW_ABBREV); } + if matches!(config.regex_mode, RegexMode::Basic | RegexMode::Extended) { + // GNU grep supports \` and \' as buffer anchors in BRE and ERE. + syntax.enable_operators(SyntaxOperator::SYNTAX_OPERATOR_ESC_GNU_BUF_ANCHOR); + } if config.regex_mode == RegexMode::Perl { // GNU grep supports `(?P...)`. // Unfortunately, the onig crate defines the OP2 flag without the diff --git a/tests/test_grep.rs b/tests/test_grep.rs index fbea0a0..6a42175 100644 --- a/tests/test_grep.rs +++ b/tests/test_grep.rs @@ -85,6 +85,21 @@ fn bre_gnu_extensions() { .stdout_only("*foo\n**foo\n"); } +#[test] +fn gnu_buffer_anchors() { + let (_s, mut c) = ucmd(); + c.args(&[r"\`c\|r\'"]) + .pipe_in("cat\nscat\ntar\ndog\n") + .succeeds() + .stdout_only("cat\ntar\n"); + + let (_s, mut c) = ucmd(); + c.args(&["-E", r"\`c|r\'"]) + .pipe_in("cat\nscat\ntar\ndog\n") + .succeeds() + .stdout_only("cat\ntar\n"); +} + #[test] fn ere_metacharacters() { let cases: &[(&[&str], &str, &str)] = &[