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

Bash 如何从字符串中删除空格?,bash,shell,posix,Bash,Shell,Posix,在ubuntu bash脚本中,如何从一个变量中删除空间 字符串将被删除 3918912k 要删除所有空白。请尝试在shell中执行此操作: var=" 3918912k" echo ${var//[[:blank:]]/} 使用(这是一个非功能) [[:blank:]是一个POSIX正则表达式类(删除空格、制表符…),请参见您还可以使用echo删除字符串开头或结尾的空格,也可以删除字符串内的重复空格 $ myVar=" kokor iiij

在ubuntu bash脚本中,如何从一个变量中删除空间

字符串将被删除

   3918912k 

要删除所有空白。请尝试在shell中执行此操作:

var="  3918912k"
echo ${var//[[:blank:]]/}
使用(这是一个非功能)


[[:blank:]
是一个POSIX正则表达式类(删除空格、制表符…),请参见您还可以使用
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

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

$ myvar='a cool variable    with   lots of   spaces in it'
$ printf -v myvar '%s' $myvar
$ echo "$myvar"
acoolvariablewithlotsofspacesinit
事实证明,它比
myvar=“${myvar//}”
稍微高效一些,但对于字符串中可能出现的glob(
*
)来说并不安全。因此,不要在生产代码中使用它。

如果您真的想使用这种方法,并且非常担心全局绑定问题(您真的应该这么做),那么可以使用
set-f
(这将完全禁用全局绑定):


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

因为您使用的是bash,最快的方法是:

shopt -s extglob # Allow extended globbing
var=" lakdjsf   lkadsjf "
echo "${var//+([[:space:]])/}"
它速度最快,因为它使用内置函数,而不是启动额外的进程

但是,如果您希望以符合POSIX的方式执行此操作,请使用
sed

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

工具
sed
tr
将通过无需替换空白来为您实现这一点

sed's///g'

tr-d'

例如:

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

Dupe trims,这里的目标是删除所有空格。这是不可靠的:如果
myVar
包含像
*
这样的特殊字符,shell将使用当前目录的文件展开它。正如freenode上的#bash总是说的。。。使用更多的引号
echo“$myvar”
防止全局等的扩展@bobpaul,它防止全局等的扩展,但也包括Mickaël想要消除的前导和尾随空格:(在非交互式shell(即脚本)中),您需要
shopt-s extglob
获取第一行。@glennjackman很好。请参阅我的更新。但是在本例中,为了删除前导空格,引号显式丢失。因此glob字符起作用。压缩为安全的一行:
myvar=“$(set-f;printf”%s“$myvar)”;echo“[$myvar]”
工作完美。这应该是公认的答案。事实上,当前公认的答案不是POSIX。对于可移植脚本,这个答案更好。如何使用它将结果保存到变量中?它是否只在
echo
中工作?我遇到了一些问题。它应该像:
result=“$STR”| set“s///g”那样工作
?参数扩展内部的替换不是POSIX。它将在Bash(可能还有我不知道的其他Shell)中工作,但在Dash中不起作用。例如,这一个也可以工作:str=“${str//}”
$ echo "   3918912k " | sed 's/ //g'
3918912k