我得到一个看起来像这样的字符串:
“abcderwer 123123 10,200 asdfasdf iopjjop”
现在我想按照 xx,xxx 方案提取数字,其中 x 是 0-9 之间的数字。例如 10,200。必须是五位数字,并且必须包含“,”。
我怎样才能做到这一点?
谢谢
您可以使用grep
:
$ echo "abcderwer 123123 10,200 asdfasdf iopjjop" | egrep -o '[0-9]{2},[0-9]{3}'
10,200
在纯 Bash 中:
pattern='([[:digit:]]{2},[[:digit:]]{3})'
[[ $string =~ $pattern ]]
echo "${BASH_REMATCH[1]}"
查看模式匹配和正则表达式。
链接:
如上所述,使用模式匹配的一种方法是使用 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
一个稍微不典型的解决方案:
< input tr -cd [0-9,\ ] | tr \ '\012' | grep '^..,...$'
(第一个 tr 删除除逗号、空格和数字之外的所有内容。第二个 tr 用换行符替换空格,将每个“数字”放在单独的行上,并且 grep 丢弃除符合您的标准的那些之外的所有内容。)
以下使用输入数据字符串的示例应该使用 sed 解决问题。
$ echo abcderwer 123123 10,200 asdfasdf iopjjop | sed -ne 's/^.*\([0-9,]\{6\}\).*$/\1/p'
10,200