Bash-从字符串中提取数字
我得到一个字符串,看起来像这样: “ABCDERVER 123123 10200 asdfasdf iopjjop” 现在我想提取数字,按照方案xx,xxx,其中x是一个介于0-9之间的数字。例如10200。必须是五位数字,并且必须包含“,” 我该怎么做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 查看模式匹配和正则表达式 链接:
谢谢您可以使用
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,这是模式匹配。