132

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?

1

4 Answers 4

185

Because sed is not perl -- sed regexes do not have a \d shorthand:

sed 's/[[:digit:]]\+\.//g'

sed regular expression documentation here.

2
  • 5
    That's if you want zero or more digits. /[[: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
  • 4
    Not very regular then, is it? Feb 12, 2020 at 17:54
107

Two problems:

  1. sed does not support \d. Use [0-9] or [[:digit:]].

  2. + must be backslashed to get the special meaning: \+.

8
  • 14
    instead of backslashing the + (which doesn't work on Mac OS X, for example) you can use the -E option to interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's). Sadly, this doesn't help with the \d issue...
    – gMale
    Aug 6, 2013 at 1:01
  • 6
    @gmale: -E does not work for GNU sed, it uses -r instead.
    – choroba
    Aug 6, 2013 at 6:54
  • 19
    Okay... it sure looks like sed just sucks when it comes to portability...
    – iconoclast
    Jul 14, 2014 at 15:16
  • @choroba I think I confused myself today. I'm going to delete my noisy comments...
    – Steven Lu
    Jun 28, 2018 at 21:47
  • 1
    Basically, what I was trying to warn people about is: If you do not use extended regex (-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
    – Steven Lu
    Jun 28, 2018 at 21:55
6

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.

5

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.