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?
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?
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:
read methods work in (non-bash) POSIX shells, although the read method requires a here document rather than bash's triple-< form.Based on posted,
by using grep
echo 'PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|marvel|' | grep -Po "(PR-)([0-9]+)" | grep -Po "[0-9]+"
the string is being echoed and redirected to grep for the first time
in first iteration grep is extracting and outputting PR-1769
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.
grep --version and tell me the grep version-P? These are strictly ERE-compatible regexes. (Not that I'd advise using grep here at all).-P-E to specify ERE, because otherwise you have BRE syntax, which doesn't support + in the way you expect, but you don't need -P.