将 sed 与反向引用一起使用

将 sed 与反向引用一起使用

我试图删除两个字符串之间的空格,它们是这样的:

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

相关内容