Message ID | 20210716125027.18824-1-mscalindt@gmail.com (mailing list archive) |
---|---|
State | Rejected |
Delegated to: | Herbert Xu |
Headers | show |
Series | [v2] expand: Recognize '^' as a negation character in BE | expand |
Dimitar Yurukov <mscalindt@gmail.com> wrote: > While performing bracket expression ('[...]'), DASH recognizes only '!' > as a special character for negation/inversion, but POSIX specifies '^'. > > The specification (2018 edition): > " > 9.3.3 BRE Special Characters > > ^ The <circumflex> shall signify a non-matching list expression when it > occurs first in a list, immediately following a <left-square-bracket> > (see RE Bracket Expression). > " This is incorrect and ^ cannot be used in a portable script. Cheers,
diff --git a/src/expand.c b/src/expand.c index 1730670..32a1b5a 100644 --- a/src/expand.c +++ b/src/expand.c @@ -1296,7 +1296,7 @@ expmeta(char *name, unsigned name_len, unsigned expdir_len) metaflag = 1; else if (*p == '[') { char *q = p + 1; - if (*q == '!') + if (*q == '!' || *q == '^') q++; for (;;) { if (*q == '\\') @@ -1565,7 +1565,7 @@ pmatch(const char *pattern, const char *string) startp = p; invert = 0; - if (*p == '!') { + if (*p == '!' || *p == '^') { invert++; p++; }
While performing bracket expression ('[...]'), DASH recognizes only '!' as a special character for negation/inversion, but POSIX specifies '^'. The specification (2018 edition): " 9.3.3 BRE Special Characters ^ The <circumflex> shall signify a non-matching list expression when it occurs first in a list, immediately following a <left-square-bracket> (see RE Bracket Expression). " DASH: $ i='123 asd' && printf "%s\n" "${i##*[!a-z]}" asd $ i='123 asd' && printf "%s\n" "${i##*[^a-z]}" $ BASH (with --posix): $ i='123 asd' && printf "%s\n" "${i##*[!a-z]}" asd $ i='123 asd' && printf "%s\n" "${i##*[^a-z]}" asd $ This patch makes <circumflex> ('^') a special character used to specify negation/inversion. Signed-off-by: Dimitar Yurukov <mscalindt@gmail.com> --- Changes in v2: - Fixed the patch (patched expmeta()) src/expand.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)