Bash - 从String中提取数字

时间:2012-05-14 08:38:15

标签: bash shell unix

我有一个看起来像这样的字符串:

“abcderwer 123123 10,200 asdfasdf iopjjop”

现在我想提取数字,遵循方案xx,xxx,其中x是0-9之间的数字。例如。 10200。必须是五位数,并且必须包含“,”。

我该怎么做?

谢谢

6 个答案:

答案 0 :(得分:9)

您可以使用grep

$ echo "abcderwer 123123 10,200 asdfasdf iopjjop" | egrep -o '[0-9]{2},[0-9]{3}'
10,200

答案 1 :(得分:4)

纯粹的Bash:

pattern='([[:digit:]]{2},[[:digit:]]{3})'
[[ $string =~ $pattern ]]
echo "${BASH_REMATCH[1]}"

答案 2 :(得分:1)

检查模式匹配和正则表达式。

链接:

Bash regular expressions

Patterns and pattern matching

SO question

并且如上所述,利用模式匹配的一种方法是使用grep。 其他用途:echo支持模式(globbing),find支持正则表达式。

答案 3 :(得分:0)

简单模式匹配(glob模式)内置于shell中。假设你有$*中的字符串(也就是说,它们是你脚本的命令行参数,或者你已经在你已经获得的字符串上使用了set),试试这个:

for token; do
  case $token in
    [0-9][0-9],[0-9][0-9][0-9] ) echo "$token" ;;
  esac
done

答案 4 :(得分:0)

以下使用输入数据字符串的示例应使用sed解决问题。

$ echo abcderwer 123123 10,200 asdfasdf iopjjop | sed -ne 's/^.*\([0-9,]\{6\}\).*$/\1/p'
10,200

答案 5 :(得分:0)

一个稍微不典型的解决方案:

< input tr -cd [0-9,\ ] | tr \  '\012' | grep '^..,...$' 

(第一个删除除逗号,空格和数字之外的所有内容 第二个tr用空行替换空格,将每个“数字”放在一个单独的位置 除了符合你标准的那些之外,grep会丢弃所有内容。)