如何从字符串中提取数字?

MOH*_*MED 7 linux bash shell substring sh

我有字符串包含一个路径

string="toto.titi.12.tata.2.abc.def"
Run Code Online (Sandbox Code Playgroud)

我想只从这个字符串中提取数字.

要提取第一个数字:

tmp="${string#toto.titi.*.}"
num1="${tmp%.tata*}"
Run Code Online (Sandbox Code Playgroud)

要提取第二个数字:

tmp="${string#toto.titi.*.tata.*.}"
num2="${tmp%.abc.def}"
Run Code Online (Sandbox Code Playgroud)

因此,要提取参数,我必须分两步完成.如何一步提取数字?

mti*_*935 11

您可以使用tr删除所有非数字字符,如下所示:

echo toto.titi.12.tata.2.abc.def | tr -d -c 0-9
Run Code Online (Sandbox Code Playgroud)

  • 其输出似乎将所有数字混合在一起,在您的示例中形成“122”。他们怎样才能分开呢? (4认同)

gho*_*oti 10

参数扩展似乎已成为当务之急。

$ string="toto.titi.12.tata.2.abc.def"
$ read num1 num2 <<<${string//[^0-9]/ }
$ echo "$num1 / $num2"
12 / 2
Run Code Online (Sandbox Code Playgroud)

这当然取决于 的格式$string。但至少对于您提供的示例来说,它似乎有效。

这可能优于需要子 shell 的 anubhava 的 awk 解决方案。我也喜欢切普纳的解决方案,但正则表达式比参数扩展“更重”(尽管显然更精确)。(请注意,在上面的表达式中,[^0-9]可能看起来像正则表达式原子,但事实并非如此。)

您可以在 bash 手册页中阅读有关此形式或参数扩展的信息。请注意,${string//this/that}(以及<<<)是 bashism,与传统的 Bourne 或 posix shell 不兼容。

  • 它取决于“$string”的格式到底是什么意思?我想不出任何可以打破它的例子。 (2认同)

cch*_*ain 10

要提取所有单个数字并在每行管道中打印一个数字 -

tr '\n' ' ' | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g'
Run Code Online (Sandbox Code Playgroud)

分解:

  • 用空格替换所有换行符: tr '\n' ' '
  • 用空格替换所有非数字: sed -e 's/[^0-9]/ /g'
  • 删除前导空格: -e 's/^ *//g'
  • 删除尾随空格: -e 's/ *$//g'
  • 将空格按顺序挤压到1个空格: tr -s ' '
  • 用换行符替换剩余的空间分隔符: sed 's/ /\n/g'

例:

echo -e " this 20 is 2sen\nten324ce 2 sort of" | tr '\n' ' ' | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /\n/g'
Run Code Online (Sandbox Code Playgroud)

将打印出来

20
2
324
2
Run Code Online (Sandbox Code Playgroud)


Adi*_*rya 6

这是一个简短的:

string="toto.titi.12.tata.2.abc.def"
id=$(echo "$string" | grep -o -E '[0-9]+')

echo $id // => output: 12 2
Run Code Online (Sandbox Code Playgroud)

数字之间有空格。希望能帮助到你...


drl*_*sta 3

如果您准确地提供了您想要获得的输出,那么这个问题会更容易回答。如果您只想从字符串中取出数字,并删除其他所有内容,您可以这样做:

d@AirBox:~$ string="toto.titi.12.tata.2.abc.def"
d@AirBox:~$ echo "${string//[a-z,.]/}"
122
Run Code Online (Sandbox Code Playgroud)

如果您澄清一点,我也许可以提供更多帮助。