evamvid
evamvid

Reputation: 861

Bash string manipulation -- removing characters?

I'm having a heck of a time removing characters in Bash. I have a string that's formatted like temp=53.0'C. I want to remove everything thats not 53.0.

I'm normally a Python programmer, and the way I'd do this in Python would be to split the string into an array of characters, and remove the unnecessary elements, before putting the array back onto string form. But I can't figure out how to do that in Bash.

How do I remove the desired characters?

Upvotes: 1

Views: 4880

Answers (4)

James
James

Reputation: 11

Also agree with Josh but would improve the pattern match to consider the full range of floating point numbers.

.*=[ ]*([0-9]*\.[0-9]+)[cC].*

If you do not understand the pattern above, take the time to find out. Learning pattern matching will be one of the most useful things you ever do.

Test your pattern with something like http://www.freeformatter.com/regex-tester.html and then tailor for the platform you are using (e.g. Unix will probably need the brackets escaped with a backslash)

Upvotes: 1

Mark Setchell
Mark Setchell

Reputation: 207465

You can use Bash parameter substitution like this:

a="temp=53.0'C"
a=${a/*=/}       # Remove everything up to and including = sign
a=${a/\'*/}      # Remove single quote and everything after it

echo $a
53.0

Further examples are available here.

Upvotes: 4

Reinstate Monica Please
Reinstate Monica Please

Reputation: 11593

Same thing with BASH_REMATCH

> [[ $tmp =~ [0-9]+\.[0-9]+ ]] && echo ${BASH_REMATCH[0]}
53.0

Upvotes: 2

Josh Jolly
Josh Jolly

Reputation: 11786

You could use sed with a regex which corresponds to the format of the string you want to be returned:

$ var="temp=53.0'C"
$ echo "$var" | sed -r 's/.*=([0-9][0-9]\.[0-9]).*/\1/g'
53.0

What exactly are the "rules" around what your original string looks like, and what the section to output looks like?

Upvotes: 1

Related Questions