我正在尝试创建一个小函数来删除所有不是数字的字符。
123a45a --->将成为---> 12345
我想出了:
temp=$word | grep -o [[:digit:]]
echo $temp
但我得12345
而不是1 2 3 4 5
。如何摆脱空间?
答案 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)
我建议改为使用sed
或perl
:
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
正如我读到的那样,您只能使用grep
和tr
,这可以解决问题:
$ 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