我试图删除两个字符串之间的空格,它们是这样的:
312.2 MB
123.34 KB
487.1 GB
我想将它们更改为:
312.2MB
123.34KB
487.1GB
我一直在努力,我可以得到:
echo "312.2 MB" | sed s/[0-9][[:space:]][GMK]//g
312.B
但是当我尝试使用以下命令进行反向引用时sed
:
echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)/\1/g
312.2 MB
我的猜测是只有一个匹配,然后反向引用是完整的匹配,但是:
echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)/TRY/g
312.2 MB
()
所以,当我使用来捕获字符时,它不再起作用
正则表达式可能不完全正确,但我不知道为什么。
答案1
问题出在引用上。
因为您没有引用sed
命令,所以括号\(...\)
在传递给 之前由 shell 解释sed
。
因此sed
将它们视为文字括号而不是转义括号,不影响反向引用。
你需要:
echo "312.2 MB" | sed 's/\([0-9]\)[[:space:]]\([GMK]\)/\1\2/g'
使反向引用受到影响,并得到你想要的。
或者更简单地说:
echo "312.2 MB" | sed 's/ //'
答案2
你没有引用你的任何sed
表达方式,这是罪魁祸首。在它周围加上引号,例如sed ' '
.或者简单地你可以通过以下tr
表达式得到它,
tr -d '[:space:]' <<< "312.2 MB"
312.2MB
tr -d ' ' <<< "123.34 KB"
123.34KB
tr -d '[:blank:]' <<< "487.1 GB"
487.1GB
如果你坚持的话sed
,你可以这样做,
sed 's/ //g'
sed 's/[[:blank:]]//g'
sed 's/[[:space:]]//g'
答案3
使用bash
:
$ txt="32.2 MB"
$ echo ${txt// /}
32.2MB