如何从字符串中删除空格?

100

在Ubuntu的Bash脚本中,如何从一个变量中去除空格

字符串将是

   3918912k 

想要删除所有的空格。


https://dev59.com/nHRC5IYBdhLWcg3wOeWB - cnicutar
1
去重修剪,这里的目标是删除所有空格。 - chux - Reinstate Monica
修剪一切,从开头到结尾以及中间的所有内容:echo ' aaa bb c'|xargs -L1 echo 这就是全部。当然,你可以将-L1更改为-n1,这样所有字符串都会转换为单独的行。 - Znik
5个回答

178

使用 sedtr 这些工具可以将空白字符替换为无内容符号。

sed 's/ //g'

tr -d ' '

示例:

$ echo "   3918912k " | sed 's/ //g'
3918912k

3
运作完美。这应该被接受为答案。 - phpguru
实际上,目前被接受的答案不符合POSIX标准。对于可移植的脚本来说,这个答案更好。 - MoonSweep
如何将结果保存到变量中?它只能在echo中使用吗?我遇到了一些问题。它是否应该像这样工作:RESULT="$STR" | set "s/ //g" - cbdeveloper
@cbdeveloper 你可以这样做: RESULT=$(sed "s/ //g" <<< $STR) - Mattias
只适用于一行中的空格,无法处理换行符。 - e-info128

107

2
参数扩展内的替换不符合POSIX标准。它可以在Bash(以及其他我不知道的shell)中工作,但在例如Dash中无法工作。 - MoonSweep
2
这个也可以工作: str="${str// /}" - Tsounabe

7

如果您正在使用bash,最快的方法是:

shopt -s extglob # Allow extended globbing
var=" lakdjsf   lkadsjf "
echo "${var//+([[:space:]])/}"

它之所以快是因为使用内置函数而不是启动额外的进程。

但是,如果您想以符合POSIX标准的方式进行操作,请使用sed

var=" lakdjsf   lkadsjf "
echo "$var" | sed 's/[[:space:]]//g'

在非交互式 shell(即脚本)中,您需要首先运行 shopt -s extglob - glenn jackman
1
@glennjackman 很好的发现。请看我的更新。 - Tim Pote

6

一个有趣的方法来从变量中删除所有空格是使用printf:

$ myvar='a cool variable    with   lots of   spaces in it'
$ printf -v myvar '%s' $myvar
$ echo "$myvar"
acoolvariablewithlotsofspacesinit

事实证明,它比myvar="${myvar// /}"稍微更有效率,但对于可能出现在字符串中的通配符(*)不安全。因此,请勿在生产代码中使用此方法。

如果您真的非常想使用这种方法并且真的很担心globbing问题(您确实应该担心),您可以使用set -f (完全禁用通配符):

$ ls
file1  file2
$ myvar='  a cool variable with spaces  and  oh! no! there is  a  glob  *  in it'
$ echo "$myvar"
  a cool variable with spaces  and  oh! no! there is  a  glob  *  in it
$ printf '%s' $myvar ; echo
acoolvariablewithspacesandoh!no!thereisaglobfile1file2init
$ # See the trouble? Let's fix it with set -f:
$ set -f
$ printf '%s' $myvar ; echo
acoolvariablewithspacesandoh!no!thereisaglob*init
$ # Since we like globbing, we unset the f option:
$ set +f

我发布这个答案只是因为它很有趣,而不是在实践中使用它。


然而在这种情况下,引号明确地缺失以便去除前导空格。因此,通配符字符正在发挥作用。 - glenn jackman
1
压缩为一行安全代码:myvar="$( set -f; printf "%s" $myvar )"; echo "[$myvar]" - user2350426

5
你也可以使用echo来去除字符串开头或结尾以及字符串内部的空格。
$ myVar="    kokor    iiij     ook      "
$ echo "$myVar"
    kokor    iiij     ook      
$ myVar=`echo $myVar`
$
$ # myVar is not set to "kokor iiij ook"
$ echo "$myVar"
kokor iiij ook

3
如果myVar包含类似*这样的特殊字符,那么它就不可靠了,因为shell会将其扩展为当前目录中的文件。 - Gilles Quénot
正如freenode上的#bash频道经常说的那样...多使用引号。echo "$myvar"可以防止通配符等的扩展。 - bobpaul
@bobpaul,它可以防止通配符的扩展等,但也包括Mickaël想要摆脱的前导和尾随空格 :( - Gui Prá

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接