【问题标题】:How to remove space from string? [duplicate]如何从字符串中删除空格? [复制]
【发布时间】:2012-11-19 12:08:50
【问题描述】:

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

字符串将是

   3918912k 

要删除所有空格。

【问题讨论】:

标签: bash shell


【解决方案1】:

sedtr 工具将通过将空白替换为空来为您完成此操作

sed 's/ //g'

tr -d ' '

例子:

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

【讨论】:

  • 完美运行。这应该是公认的答案。
  • 确实,当前接受的答案不是 POSIX。对于可移植脚本,这个答案更好。
  • 如何使用它将结果保存在变量中?它只适用于echo 吗?我遇到了一些麻烦。它应该像:RESULT="$STR" | set "s/ //g" 一样工作吗?
  • @cbdeveloper 你可以这样做:RESULT=$(sed "s/ //g" <<< $STR)
【解决方案2】:

尝试在 shell 中执行此操作:

var="  3918912k"
echo ${var//[[:blank:]]/}

使用parameter expansion(它不是 功能)

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

【讨论】:

  • 参数扩展内的替换不是 POSIX。它可以在 Bash(可能还有其他我不知道的 shell)中工作,但不能在 Dash 中工作。
  • 这个也可以:str="${str// /}"
【解决方案3】:

您还可以使用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

【讨论】:

  • 这是不可靠的:如果myVar包含*这样的特殊字符,shell会用当前目录的文件展开它。
  • 正如 freenode 上的#bash 总是说...使用更多引号。 echo "$myvar" 防止 glob 等扩展。
  • @bobpaul,它可以防止 glob 等的扩展,但还包括 Mickaël 打算摆脱的前导和尾随空格:(
【解决方案4】:

由于您使用的是 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
  • @glennjackman 很好。查看我的更新。
【解决方案5】:

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

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

事实证明它比myvar="${myvar// /}" 稍微高效一些,但对于可能出现在字符串中的glob (*) 来说并不安全。所以不要在生产代码中使用它。

如果你真的很想使用这种方法并且真的担心通配问题(你真的应该这样做),你可以使用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

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

【讨论】:

  • 但是,在这种情况下,引号明显缺失,以删除前导空格。所以 glob 字符在起作用。
  • 浓缩成安全的一行:myvar="$( set -f; printf "%s" $myvar )"; echo "[$myvar]"
猜你喜欢
  • 2013-12-11
  • 2022-01-24
  • 2011-12-07
  • 2018-08-15
  • 2021-09-04
  • 2017-04-14
  • 2019-04-19
  • 2018-03-31
相关资源
最近更新 更多