I'm trying to use sed
to substitute all the patterns with digits followed immediately by a dot (such as 3.
, 355.
) by an empty string. So I try:
sed 's/\d+\.//g' file.txt
But it doesn't work. Why is that?
Because sed is not perl -- sed regexes do not have a \d
shorthand:
sed 's/[[:digit:]]\+\.//g'
sed regular expression documentation here.
/[[:digit:]]*\. /
will match the string foo.
because you allow for zero digits. If you want one or more use \+
as shown
Mar 2, 2016 at 11:19
Two problems:
sed
does not support \d
. Use [0-9]
or [[:digit:]]
.
+
must be backslashed to get the special meaning: \+
.
interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).
Sadly, this doesn't help with the \d issue...
sed
just sucks when it comes to portability...
Jul 14, 2014 at 15:16
-E
on BSD sed and -r
on GNU sed), in BSD sed, neither +
nor \+
(same with ?
) will work at all, whereas in GNU sed you can get them to work with the backslash. Hence the common recommendation to use extended regex in scripting
Jun 28, 2018 at 21:55
Adding to the other answers a few years later, I found I wanted the extended feature for a more complex regex
This expects simply +
for one or more, and generally made the string more obvious to me for both my case and this one
# NOTE \d is not supported
sed --regexp-extended 's/[0-9]+\.//g'
-E
-r
--regexp-extended
are all the same
Using sed
4.7
The sed man page references the re_format man page. It makes 2 distinctions: (1) obsolete versus extended regular expressions; (2) non-enhanced versus enhanced regular expressions. All 4 combinations are possible. There is support in sed for both obsolete and extended, but in either case only for non-enhanced. The \d operator is a feature of enhanced regular expressions, therefore not supported by sed.