On Sat, Apr 16, 2022 at 10:37:14AM +0800, wilson wrote:
> in shell script, how can I use regex to extract values from a string?

"Some people, when confronted with a problem, think ``I know, I'll use
regular expressions.'' Now they have two problems."

> for instance the string: "black berry 12".
> I want go get the name: black berry [String]
> the price: 12 [Int]

Ideally we would want to see more input samples.  Is the "price" always
the last input word, after the last whitespace character?  Is the "name"
always the set of words up to but not including the last chunk of
whitespace characters?

Let's assume that these guesses are true.

If the chunks of whitespace are always precisely ONE space character
apiece, then it's really easy:

string="black berry 12"
name=${string% *}
price=${string##* }

And that will work in sh (POSIX, not Bourne) or bash.  We can also allow
the whitespace to be either a space or a tab (or some other esoteric
characters) by replacing the literal space with a character class pattern:

string="black berry 12"
name=${string%[[:space:]]*}
price=${string##*[[:space:]]}

That's still POSIX sh compatible.

If the chunks might be MORE than one whitespace character apiece, then
we need something a bit uglier.  We could use bash with its extended
globs:

shopt -s extglob
string=$'black berry\t\t\t12'
price=${string##*[[:space:]]}
name=${string%%+([[:space:]])"$price"}

There are many other solutions, of course.

I also suggest <https://mywiki.wooledge.org/BashFAQ/100> as additional
reading.

Reply via email to