Extract substring in Bash


Given a filename in the form someletters_12345_moreleters.ext, I want to extract the 5 digits and put them into a variable.

So to emphasize the point, I have a filename with x number of characters then a five digit sequence surrounded by a single underscore on either side then another set of x number of characters. I want to take the 5 digit number and put that into a variable.

I am very interested in the number of different ways that this can be accomplished.

10/9/2017 4:03:04 AM

Accepted Answer

Use cut:

echo 'someletters_12345_moreleters.ext' | cut -d'_' -f 2

More generic:

SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)
11/4/2015 10:51:55 PM

If x is constant, the following parameter expansion performs substring extraction:


where 12 is the offset (zero-based) and 5 is the length

If the underscores around the digits are the only ones in the input, you can strip off the prefix and suffix (respectively) in two steps:

tmp=${a#*_}   # remove prefix ending in "_"
b=${tmp%_*}   # remove suffix starting with "_"

If there are other underscores, it's probably feasible anyway, albeit more tricky. If anyone knows how to perform both expansions in a single expression, I'd like to know too.

Both solutions presented are pure bash, with no process spawning involved, hence very fast.

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow