从字符串中删除所有不是数字的字符

时间:2013-05-23 15:09:41

标签: bash grep

我正在尝试创建一个小函数来删除所有不是数字的字符。

  

123a45a --->将成为---> 12345

我想出了:

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

但我得12345而不是1 2 3 4 5。如何摆脱空间?

7 个答案:

答案 0 :(得分:8)

Pure bash:

word=123a45a 
number=${word//[^0-9]}

答案 1 :(得分:6)

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

var='123a45a'
echo ${var//[^0-9]/}
12345

答案 2 :(得分:4)

这就是你要找的东西吗?

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

grep& TR

echo "123a45a"|grep -o '[0-9]'|tr -d '\n'
12345

答案 3 :(得分:3)

我建议改为使用sedperl

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")"

答案 4 :(得分:2)

如何使用sed

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

正如我读到的那样,您只能使用greptr,这可以解决问题:

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

在你的情况下,

temp=$(echo $word | grep -o [[:digit:]] | tr -d '\n')

答案 5 :(得分:2)

tr也可以工作:

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

# output: 12345

答案 6 :(得分:0)

Grep会在不同的行返回结果:

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

所以你不能在过滤过程中删除这些空格,但你可以在之后,因为$temp可以像这样转换自己:

temp=`echo $temp | tr -d ' '`
$ echo "$temp"
12345