如何从shell变量中删除空格?


15

我已经在命令行完成了以下操作:

$ text="name with space"
$ echo $text
name with space

我试图用来tr -d ' '删除空格,结果是:

namewithspace

我已经尝试过一些方法,例如:

text=echo $text | tr -d ' '

到目前为止,还没有运气,希望您的好朋友能为您提供帮助!

Answers:


45

在Bash中,您可以使用Bash的内置字符串操作。在这种情况下,您可以执行以下操作:

> text="some text with spaces"
> echo "${text// /}"
sometextwithspaces

有关字符串操作运算符的更多信息,请参见http://tldp.org/LDP/abs/html/string-manipulation.html

但是,您的原始策略也可以使用,语法略有偏离:

> text2=$(echo $text | tr -d ' ')
> echo $text2
sometextwithspaces

我什至没有想到这一点,正为此而努力!很好的答案!
user3347022 2014年

11

您根本不需要echo命令,只需使用Here String即可

text=$(tr -d ' ' <<< "$text")

出于好奇,我检查了这项琐碎的任务需要花费多少时间才能使用不同的工具。以下是从最慢到最快排序的结果:

abc="some text with spaces"

$ time (for i in {1..1000}; do def=$(echo $abc | tr -d ' '); done)
0.76s user 1.85s system 52% cpu 4.976 total

$ time (for i in {1..1000}; do def=$(awk 'gsub(" ","")' <<< $abc); done)
1.09s user 2.69s system 88% cpu 4.255 total

$ time (for i in {1..1000}; do def=$(awk '$1=$1' OFS="" <<< $abc); done)
1.02s user 1.75s system 69% cpu 3.968 total

$ time (for i in {1..1000}; do def=$(sed 's/ //g' <<< $abc); done)
0.85s user 1.95s system 76% cpu 3.678 total

$ time (for i in {1..1000}; do def=$(tr -d ' ' <<< $abc); done)
0.73s user 2.04s system 85% cpu 3.244 total

$ time (for i in {1..1000}; do def=${abc// /}; done)
0.03s user 0.00s system 59% cpu 0.046 total

纯shell操作绝对是最快的,这不足为奇,但令人印象深刻的是,它比最慢的命令快100倍!



5

只需如下修改文本变量。

text=$(echo $text | tr -d ' ')

但是,如果我们有控制字符,则可能会中断。因此,按照卡巴斯德的建议,我们可以在它周围加上双引号。所以,

text="$(echo "$text" | tr -d ' ')"

将是一个更好的版本。


精彩!我太近了。作为菜鸟,我很高兴我朝着正确的方向前进!同样,也感谢您的快速回复,我等了8分钟后便会提交此答案!
user3347022 2014年

@ user3347022,不客气:)
Ramesh

1
如果$text包含控制字符(这将由外壳程序解释),这将中断。最好在其中添加一些双引号:text="$(echo "$text" | tr -d ' ')"
kasperd 2014年

@kasperd,感谢您提及它。我已经采纳了你的建议。
拉梅什(Ramesh)2014年


2

在需要具有数字的变量时的一种特殊情况:

sh:

typeset -i A=B #or
typeset -i A="   23232"

ksh:

typeset -n A=B #or
typeset -n A="   23232"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.