175

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?

kenorb
  • 26,615
Mika H.
  • 1,939

4 Answers4

238

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

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

sed regular expression documentation here.

glenn jackman
  • 27,524
135

Two problems:

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

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

choroba
  • 20,299
13

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

ti7
  • 256
8

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.