commit ced76f3b033a7687a46364e393e0846d00d4d6a0
parent 844267bce4cda7f8aef4e88b31a4b2cedcecf54b
Author: Eivind Uggedal <eivind@uggedal.com>
Date: Tue, 26 May 2015 21:36:19 +0000
sed: support extended regular expressions (-E)
Not specified in POSIX.1-2008.
GNU sed uses -r, openbsd uses -E but aliases -r to -E for compat.
Diffstat:
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/sed.c b/sed.c
@@ -221,6 +221,7 @@ static String patt, hold, genbuf;
static struct {
unsigned int n :1; /* -n (no print) */
+ unsigned int E :1; /* -E (extended re) */
unsigned int s :1; /* s/// replacement happened */
unsigned int aci_cont:1; /* a,c,i text continuation */
unsigned int s_cont :1; /* s/// replacement text continuation */
@@ -360,6 +361,7 @@ usage(void)
/* Differences from POSIX
* we allows semicolons and trailing blanks inside {}
* we allow spaces after ! (and in between !s)
+ * we allow extended regular expressions (-E)
*/
static void
compile(char *s, int isfile)
@@ -499,7 +501,7 @@ make_addr(Addr *addr, char *s)
p -= escapes(s, p, delim, 0);
*p++ = '\0';
addr->u.re = emalloc(sizeof(*addr->u.re));
- eregcomp(addr->u.re, s, 0);
+ eregcomp(addr->u.re, s, gflags.E ? REG_EXTENDED : 0);
s = p;
}
} else {
@@ -844,7 +846,7 @@ get_s_arg(Cmd *c, char *s)
} else {
c->u.s.re = emalloc(sizeof(*c->u.s.re));
/* FIXME: different eregcomp that calls fatal */
- eregcomp(c->u.s.re, s, 0);
+ eregcomp(c->u.s.re, s, gflags.E ? REG_EXTENDED : 0);
}
s = p + runelen(delim);
}
@@ -1689,6 +1691,9 @@ main(int argc, char *argv[])
case 'n':
gflags.n = 1;
break;
+ case 'E':
+ gflags.E = 1;
+ break;
case 'e':
arg = EARGF(usage());
compile(arg, 0);