关于bash:如何从字符串中删除空格?

How to remove space from string?

本问题已经有最佳答案,请猛点这里访问。

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

字符串将是

1
   3918912k

想要删除所有空白区域。


工具sedtr将通过交换空格来为您执行此操作

sed 's/ //g'

tr -d ' '

例:

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


尝试在shell中执行此操作:

1
2
s="  3918912k"
echo ${s//[[:blank:]]/}

这使用参数扩展(这是一个非posix功能)

[[:blank:]]是POSIX正则表达式类(删除空格,制表符......),请参阅http://www.regular-expressions.info/posixbrackets.html


由于您使用bash,最快的方法是:

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

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

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

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


您还可以使用echo删除字符串的开头或结尾处的空格,还可以在字符串内重复空格。

1
2
3
4
5
6
7
8
$ 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:

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

事实证明它比myvar="${myvar// /}"更有效,但对于字符串中可能出现的globs(*)不安全。所以不要在生产代码中使用它。

如果你真的真的想要使用这种方法而且真的很担心全局事物(你真的应该),你可以使用set -f(它完全禁用了globbing):

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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

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