2

I'm trying to make a small function that removes all the chars that are not digits.

123a45a ---> will become ---> 12345

I've came up with :

temp=$word | grep -o [[:digit:]]
echo $temp

But instead of 12345 I get 1 2 3 4 5. How to I get rid of the spaces?

4

7 回答 7

8

纯重击:

word=123a45a 
number=${word//[^0-9]}
于 2013-05-23T15:13:43.577 回答
6

这是一个纯粹的 bash 解决方案

var='123a45a'
echo ${var//[^0-9]/}
12345
于 2013-05-23T15:13:54.030 回答
4

这是你想要的?

kent$  echo "123a45a"|sed 's/[^0-9]//g'
12345

grep & tr

echo "123a45a"|grep -o '[0-9]'|tr -d '\n'
12345
于 2013-05-23T15:13:08.837 回答
3

我建议使用sedorperl代替:

temp="$(sed -e 's/[^0-9]//g' <<< "$word")"
temp="$(perl -pe 's/\D//g' <<< "$word")"

编辑添加:如果你真的需要使用grep,那么这是我能想到的唯一方法:

temp="$( grep -o '[0-9]' <<< "$word" \
         | while IFS= read -r ; do echo -n "$REPLY" ; done
       )"

. . . 但可能有更好的方法。(它使用grep -o,就像您的解决方案一样,然后在它输出的行上运行并重新输出它们而没有换行符。)


再次编辑添加:现在您已经提到您可以使用可以tr代替,这更容易:

temp="$(tr -cd 0-9 <<< "$word")"
于 2013-05-23T15:13:14.447 回答
2

怎么用sed

$ echo "123a45a" | sed -r 's/[^0-9]//g'
12345

正如我所读到的,您只允许使用grepand tr,这可以解决问题:

$ echo "123a45a" | grep -o [[:digit:]] | tr -d '\n'
12345

在你的情况下,

temp=$(echo $word | grep -o [[:digit:]] | tr -d '\n')
于 2013-05-23T15:13:20.220 回答
2

tr 也可以:

echo "123a45a" | tr -cd '[:digit:]'

# output: 12345
于 2013-05-23T15:14:53.457 回答
0

Grep在不同的行返回结果:

$ echo -e "$temp"
1
2
3
4
5

因此,您不能在过滤期间删除这些空格,但之后可以,因为$temp可以像这样转换自己:

temp=`echo $temp | tr -d ' '`
$ echo "$temp"
12345
于 2013-05-23T15:20:19.777 回答