How to extract a value from a string using regex and a shell?
I am in shell and I have this string: 12 BBQ ,45 rofl, 89 lo开发者_开发问答l
Using the regexp: \d+ (?=rofl)
, I want 45
as a result.
Is it correct to use regex to extract data from a string? The best I have done is to highlight the value in some of the online regex editor. Most of the time it remove the value from my string.
I am investigating expr
, but all I get is syntax errors.
How can I manage to extract 45 in a shell script?
You can do this with GNU grep's perl mode:
echo "12 BBQ ,45 rofl, 89 lol" | grep -P '\d+ (?=rofl)' -o
echo "12 BBQ ,45 rofl, 89 lol" | grep --perl-regexp '\d+ (?=rofl)' --only-matching
-P
and --perl-regexp
mean Perl-style regular expression.
-o
and --only-matching
mean to output only the matching text.
Yes regex can certainly be used to extract part of a string. Unfortunately different flavours of *nix and different tools use slightly different Regex variants.
This sed command should work on most flavours (Tested on OS/X and Redhat)
echo '12 BBQ ,45 rofl, 89 lol' | sed 's/^.*,\([0-9][0-9]*\).*$/\1/g'
It seems that you are asking multiple things. To answer them:
- Yes, it is ok to extract data from a string using regular expressions, that's what they're there for
- You get errors, which one and what shell tool do you use?
You can extract the numbers by catching them in capturing parentheses:
.*(\d+) rofl.*
and using
$1
to get the string out (.*
is for "the rest before and after on the same line)
With sed as example, the idea becomes this to replace all strings in a file with only the matching number:
sed -e 's/.*(\d+) rofl.*/$1/g' inputFileName > outputFileName
or:
echo "12 BBQ ,45 rofl, 89 lol" | sed -e 's/.*(\d+) rofl.*/$1/g'
Using ripgrep's replace option, it is possible to change the output to a capture group:
rg --only-matching --replace '$1' '(\d+) rofl'
--only-matching
or-o
outputs only the part that matches instead of the whole line.--replace '$1'
or-r
replaces the output by the first capture group.
you can use the shell(bash for example)
$ string="12 BBQ ,45 rofl, 89 lol"
$ echo ${string% rofl*}
12 BBQ ,45
$ string=${string% rofl*}
$ echo ${string##*,}
45
You can certainly extract that part of a string and that's a great way to parse out data. Regular expression syntax varies a lot so you need to reference the help file for the regex you're using. You might try a regular expression like:
[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+
If your regex program can do string replacement then replace the entire string with the result you want and you can easily use that result.
You didn't mention if you're using bash or some other shell. That would help get better answers when asking for help.
You can use rextract to extract using a regular expression and reformat the result.
Example:
[$] echo "12 BBQ ,45 rofl, 89 lol" | ./rextract '[,]([\d]+) rofl' '${1}'
45
精彩评论