Reputation: 3829
I am in shell and I have this string: 12 BBQ ,45 rofl, 89 lol
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?
Upvotes: 79
Views: 158767
Reputation: 284786
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.
Upvotes: 102
Reputation: 75578
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.Upvotes: 6
Reputation: 19
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
Upvotes: -2
Reputation: 14441
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.
Upvotes: -1
Reputation: 342263
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
Upvotes: 2
Reputation: 28392
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'
Upvotes: 36
Reputation: 57149
It seems that you are asking multiple things. To answer them:
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'
Upvotes: 9