Bash-从字符串中提取数字

Bash-从字符串中提取数字,bash,shell,unix,Bash,Shell,Unix,我得到一个字符串,看起来像这样: “ABCDERVER 123123 10200 asdfasdf iopjjop” 现在我想提取数字,按照方案xx,xxx,其中x是一个介于0-9之间的数字。例如10200。必须是五位数字,并且必须包含“,” 我该怎么做 谢谢您可以使用grep: $ echo "abcderwer 123123 10,200 asdfasdf iopjjop" | egrep -o '[0-9]{2},[0-9]{3}' 10,200 查看模式匹配和正则表达式 链接:

我得到一个字符串,看起来像这样:

“ABCDERVER 123123 10200 asdfasdf iopjjop”

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

我该怎么做


谢谢

您可以使用
grep

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

查看模式匹配和正则表达式

链接:

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

简单模式匹配(glob模式)内置于shell中。假设您在
$*
中有字符串(也就是说,它们是脚本的命令行参数,或者您对以其他方式获得的字符串使用了
set
),请尝试以下操作:

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

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

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

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

有点不典型的解决方案:

< input tr -cd [0-9,\ ] | tr \  '\012' | grep '^..,...$' 
(第一个tr删除除逗号、空格和数字以外的所有内容 第二个tr用换行符替换空格,将每个“数字”放在一个单独的位置上
行,grep将丢弃除符合您的标准之外的所有内容。)

这将是
$@
。这是有区别的。当您访问命令行时,
$*
$@
之间肯定有区别;但是我特别选择了使用原始的Bourne名称调用包含
argv
数组的变量,因为许多初学者级的讲解都使用这个名称;在这种情况下,当您希望将值拆分为以空格分隔的标记时,脚本将使用这种方法。我同意,如果您必须在脚本中直接引用位置参数,
“$@”
几乎总是您想要的;执行回显“$arg”;完成
做正确的事情。这些很少做正确的事情:
$*
“$*”
(很少=仅当您希望展平参数时)。继续重复错误的入门级说明是没有意义的;在这里做正确的事情,不管你是如何得到这些东西的;有什么好争论的呢?
echo
没有,而且
find
不适用于这个问题。@DennisWilliamson我从来没有说过它们是。你可以用回声模式。示例:echo*ocu?ent?如果你在一个普通的主文件夹中,你会返回“文档”。我知道你指的是正则表达式,我会编辑:)那不是正则表达式,那是全局的。@DennisWilliamson,这是模式匹配。