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.