Bash - 从字符串中提取数字

5

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

"abcderwer 123123 10,200 asdfasdf iopjjop"

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

我该怎么做?

谢谢

6个回答

11
你可以使用 grep
$ echo "abcderwer 123123 10,200 asdfasdf iopjjop" | egrep -o '[0-9]{2},[0-9]{3}'
10,200

5

使用纯Bash:

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

1

1
“echo” 不适用于该问题,“find”也不适用。 - Dennis Williamson
@DennisWilliamson 我从未说过它们是。而且你可以在echo中使用模式。例如:如果您在常规主文件夹中,则echo *ocu?ent?将返回“Documents”。我知道你指的是正则表达式,我会编辑它 :) - keyser
那不是正则表达式,那是通配符匹配。 - Dennis Williamson
@DennisWilliamson 这是模式匹配。 - keyser

1

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

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

1
那将是 $@。有所不同。 - Dennis Williamson
当您访问命令行时,$*$@之间肯定存在差异;但我特别选择按其原始Bourne名称称呼包含argv数组的变量,因为这是许多初学者级别的阐述所使用的名称;在这种情况下,当您希望将值拆分为以空格分隔的标记时,脚本会使用它。我同意,如果您必须直接引用位置参数,则几乎总是要使用"$@" - tripleee
例如,使用set -- 'abc def' ghifor arg in "$@"; do echo "$arg"; done可以正确执行。但是,$*"$*"通常不会得到正确的结果(只有在您想要展开参数时才会得到正确的结果)。继续重复错误的初学者级别的解释是没有意义的。 - Dennis Williamson
无论你如何将东西放进去,for token; do 在这里都是正确的;有什么好争论的呢? - tripleee

0
以下示例使用您的输入数据字符串,应该可以使用sed解决问题。
$ echo abcderwer 123123 10,200 asdfasdf iopjjop | sed -ne 's/^.*\([0-9,]\{6\}\).*$/\1/p'
10,200

0
一个稍微有些不典型的解决方案:
< input tr -cd [0-9,\ ] | tr \  '\012' | grep '^..,...$' 

(第一个tr除了逗号、空格和数字之外的所有内容。第二个tr将空格替换为换行符,将每个“数字”放在单独的一行上,grep丢弃除符合您条件的内容之外的所有内容。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接