5

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

“abcderwer 123123 10,200 asdfasdf iopjjop”

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

我怎样才能做到这一点?

谢谢

4

6 回答 6

11

您可以使用grep

$ echo "abcderwer 123123 10,200 asdfasdf iopjjop" | egrep -o '[0-9]{2},[0-9]{3}'
10,200
于 2012-05-14T08:42:12.450 回答
5

在纯 Bash 中:

pattern='([[:digit:]]{2},[[:digit:]]{3})'
[[ $string =~ $pattern ]]
echo "${BASH_REMATCH[1]}"
于 2012-05-14T13:27:47.410 回答
1

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

链接:

Bash 正则表达式

模式和模式匹配

所以问题

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

于 2012-05-14T08:42:21.743 回答
1

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

for token; do
  case $token in
    [0-9][0-9],[0-9][0-9][0-9] ) echo "$token" ;;
  esac
done
于 2012-05-14T09:13:50.487 回答
0

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

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

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

于 2012-05-14T14:22:34.100 回答
0

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

$ echo abcderwer 123123 10,200 asdfasdf iopjjop | sed -ne 's/^.*\([0-9,]\{6\}\).*$/\1/p'
10,200
于 2012-05-14T09:17:10.097 回答