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