How to extract numbers from a string?

前端 未结 10 1948
青春惊慌失措
青春惊慌失措 2020-12-10 04:20

I have string contains a path

string=\"toto.titi.12.tata.2.abc.def\"

I want to extract only the numbers from this string.

To extrac

相关标签:
10条回答
  • 2020-12-10 05:07

    Fixing newline issue (for mac terminal):

    cat temp.txt | tr '\n' ' ' | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed $'s/ /\\\n/g'
    
    0 讨论(0)
  • 2020-12-10 05:09

    Parameter expansion would seem to be the order of the day.

    $ string="toto.titi.12.tata.2.abc.def"
    $ read num1 num2 <<<${string//[^0-9]/ }
    $ echo "$num1 / $num2"
    12 / 2
    

    This of course depends on the format of $string. But at least for the example you've provided, it seems to work.

    This may be superior to anubhava's awk solution which requires a subshell. I also like chepner's solution, but regular expressions are "heavier" than parameter expansion (though obviously way more precise). (Note that in the expression above, [^0-9] may look like a regex atom, but it is not.)

    You can read about this form or Parameter Expansion in the bash man page. Note that ${string//this/that} (as well as the <<<) is a bashism, and is not compatible with traditional Bourne or posix shells.

    0 讨论(0)
  • 2020-12-10 05:09

    Use regular expression matching:

    string="toto.titi.12.tata.2.abc.def"
    [[ $string =~ toto\.titi\.([0-9]+)\.tata\.([0-9]+)\. ]]
    # BASH_REMATCH[0] would be "toto.titi.12.tata.2.", the entire match
    # Successive elements of the array correspond to the parenthesized
    # subexpressions, in left-to-right order. (If there are nested parentheses,
    # they are numbered in depth-first order.)
    first_number=${BASH_REMATCH[1]}
    second_number=${BASH_REMATCH[2]}
    
    0 讨论(0)
  • 2020-12-10 05:09

    Using awk:

    arr=( $(echo $string | awk -F "." '{print $3, $5}') )
    num1=${arr[0]}
    num2=${arr[1]}
    
    0 讨论(0)
提交回复
热议问题