Chris Hansen
Chris Hansen

Reputation: 8685

How can I parse a string using bash to get a number

I have the following string:

PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|jaga|

How can I parse the string above using bash so that I get the 1769?

Also, how do I get the last string jaga using bash?

Upvotes: 0

Views: 84

Answers (3)

Charles Duffy
Charles Duffy

Reputation: 295954

There's no need for grep here: bash has built-in regex support, which is vastly more efficient to use than starting up an external utility just to process a single line:

re='^PR-([0-9]+)'
s='PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|marvel|'

if [[ $s =~ $re ]]; then
  echo "Matched: ${BASH_REMATCH[1]}"
fi

You can also use parameter expansions:

s='PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|marvel|'
s="${s%%'|'*}" # trim off everything after the first |
s="${s#PR-}"   # trim off the leading PR
echo "$s"

If you needed to extract the individual fields, by the way, read might be the correct tool for the job:

s='PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|marvel|'
IFS='|' read -r pr hash username <<<"$s"

...the above will put PR-1769 into the variable pr, 7bb12d4152a497cef491e0a1088b3984ad92972f into the variable hash, and marvel into the variable username. To strip off the PR-, then, might simply look like:

echo "${pr#PR-}"

...or, to print the extracted username:

echo "$username"

See:

Upvotes: 2

featuredpeow
featuredpeow

Reputation: 2201

It could be done using awk:

echo 'PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|jaga|'|awk -F'|' '{print substr($1, 4)}'

Upvotes: 0

Miloš Đakonović
Miloš Đakonović

Reputation: 3871

Based on posted,

by using grep

echo 'PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|marvel|' | grep -Po "(PR-)([0-9]+)" | grep -Po "[0-9]+"
  1. the string is being echoed and redirected to grep for the first time

  2. in first iteration grep is extracting and outputting PR-1769

  3. PR-1769 is in second iteration redirected to grep again, now 1769 is extracted and outputted


This is only first-shot version of solution, some grep regex expert would certainly know how to do it with single grep call.

It will only give you result if echoed string is in PR-NUMBER format, as you have presented.

Upvotes: 0

Related Questions