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

后端 未结 3 894
轻奢々
轻奢々 2021-01-28 07:51

I have the following string:

PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|jaga|

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

相关标签:
3条回答
  • 2021-01-28 08:25

    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.

    0 讨论(0)
  • 2021-01-28 08:33

    It could be done using awk:

    echo 'PR-1769|7bb12d4152a497cef491e0a1088b3984ad92972f|jaga|'|awk -F'|' '{print substr($1, 4)}'
    
    0 讨论(0)
  • 2021-01-28 08:44

    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:

    • BashFAQ #100 ("How do I do string manipulations in bash?")
    • bash-hackers.org parameter expansion reference
    0 讨论(0)
提交回复
热议问题