Village
Village

Reputation: 24363

Using negative numbers with sed

When using sed, I can use [0-9] to match any number. However, this seems to only look for positive numbers. How can I have it also look for numbers beginning with -, for e.g.: -10?

Upvotes: 1

Views: 3647

Answers (3)

Trott
Trott

Reputation: 70075

[0-9] does not match the numbers 0 through 9. It matches the characters 0,1,2,3,4,5,6,7,8, and 9.

To have it require that a - character precede it, just put it in there, escaped with a backslash so it doesn't have its usual special meaning in a regexp. So \-[1-9] will match the strings -1, -2, etc. up to -9.

If you want it to match any negative number, use:

\-[0-9]+

(The + means "one or more occurrences of the previous thing" so in this case "one or more digits".)

If you want it to match any negative or positive number, use:

\-?[0-9]+  

(The ? means "one or zero occurrences of the previous thing" so here it means "a - or nothing".)

UPDATE

@Jonathan Leffler points out that the above will not work if your version of sed does not support extended regular expressions. If they don't work, use these instead:

\-[0-9]\{1,\}
\-\{0,1\}[0-9]\{1,\}

Also, Jonathan's answer also includes this, which will match a leading + too--not requested in the question, but a good touch for sure:

[-+]\{0,1\}[0-9]\{1,\}

Upvotes: 4

Jonathan Leffler
Jonathan Leffler

Reputation: 753665

The regex [0-9] matches any single decimal digit.

To match an optionally signed decimal integer in sed, use:

[-+]\{0,1\}[0-9]\{1,\}

The \{0,1\} means match 0 or 1 occurrence of the preceding regex (which is either a - or a +), followed by \{1,\} (one or more) digits [0-9].

Upvotes: 2

Ry-
Ry-

Reputation: 224904

This should work:

\-?[0-9]+

 

Upvotes: 2

Related Questions