![如何从 shell 变量中删除空格?](https://linux22.com/image/56076/%E5%A6%82%E4%BD%95%E4%BB%8E%20shell%20%E5%8F%98%E9%87%8F%E4%B8%AD%E5%88%A0%E9%99%A4%E7%A9%BA%E6%A0%BC%EF%BC%9F.png)
我在命令行中执行了以下操作:
$ text="name with space"
$ echo $text
name with space
我正在尝试使用tr -d ' '
删除空格并得到以下结果:
namewithspace
我尝试过一些事情,例如:
text=echo $text | tr -d ' '
到目前为止还没有运气,所以希望你们能提供帮助!
答案1
在 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
答案2
echo
您根本不需要命令,只需使用这里字符串反而:
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 多倍!
答案3
只需如下修改您的文本变量即可。
text=$(echo $text | tr -d ' ')
但是,如果我们有控制字符,这可能会中断。因此,根据 Kasperd 的建议,我们可以在它周围加上双引号。所以,
text="$(echo "$text" | tr -d ' ')"
将是一个更好的版本。
答案4
当您需要具有数字的变量时的特殊情况:
嘘:
typeset -i A=B #or
typeset -i A=" 23232"
克什:
typeset -n A=B #or
typeset -n A=" 23232"