I have the following string:
PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|jaga|
How can I parse the string above using bash so that I get t
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.
It could be done using awk:
echo 'PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|jaga|'|awk -F'|' '{print substr($1, 4)}'
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: