Home > database >  Cut string of numbers at letter in bash
Cut string of numbers at letter in bash

Time:01-04

I have a string such as plantford1775.274.284b63.11.

I have been using identity=$( echo "$identity" | cut -d'.' -f3) to cut at each dot, and then choose the third section. I am left with 284b63.

The format of this part is always a letter, sandwiched by varying amounts of numbers. I would like to take the first few numbers before the letter. An example code line would be this:

identity=$( echo "$identity" | cut -d'anyletter' -f1)

What do I replace anyletter with to cut at whatever letter is listed there, so that I end with a string of 284?

CodePudding user response:

Maybe you can use a bash regex and get the result from $BASH_REMATCH.

[[ "$identity" =~ ([0-9] )[a-z][0-9]  ]] && identity="${BASH_REMATCH[1]}"

CodePudding user response:

Try:

echo plantford1775.274.284b63.11 | cut -d. -f3 | sed 's/[a-z].*//'

CodePudding user response:

Or a slight variation on the REGEX, with [[...]] in bash:

v="plantford1775.274.284b63.11"
[[ $v =~ ^[^.] .[^.] .([^.] ).*$ ]] && echo ${BASH_REMATCH[1]}

Output

284b63

Or if you are only interested in the digits before the letter:

[[ $v =~ ^[^.] .[^.] .([[:digit:]] )[^.] .*$ ]] && echo ${BASH_REMATCH[1]}

Output

284

CodePudding user response:

This could be done in single awk, please try following written and tested with your shown samples.

echo "$identity" | awk -F'.' '{gsub(/[^0-9]*/,"",$3);print $3}'

Explanation: simple explanation would be, passing echo command's output as a standard input to awk code. In awk program, setting field separator as . for values. Then in 3rd field substituting(using sub function of awk) everything apart from digits with NULL in 3rd field, then printing it.

  •  Tags:  
  • Related