【发布时间】:2012-11-19 12:08:50
【问题描述】:
在 ubuntu bash 脚本中如何从一个变量中删除空格
字符串将是
3918912k
要删除所有空格。
【问题讨论】:
-
复制修剪,这里的目标是删除所有空格。
在 ubuntu bash 脚本中如何从一个变量中删除空格
字符串将是
3918912k
要删除所有空格。
【问题讨论】:
sed 或 tr 工具将通过将空白替换为空来为您完成此操作
sed 's/ //g'
tr -d ' '
例子:
$ echo " 3918912k " | sed 's/ //g'
3918912k
【讨论】:
echo 吗?我遇到了一些麻烦。它应该像:RESULT="$STR" | set "s/ //g" 一样工作吗?
RESULT=$(sed "s/ //g" <<< $STR)
尝试在 shell 中执行此操作:
var=" 3918912k"
echo ${var//[[:blank:]]/}
使用parameter expansion(它不是posix 功能)
[[:blank:]] 是一个 POSIX 正则表达式类(删除空格、制表符...),请参阅http://www.regular-expressions.info/posixbrackets.html
【讨论】:
您还可以使用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会用当前目录的文件展开它。
echo "$myvar" 防止 glob 等扩展。
由于您使用的是 bash,因此最快的方法是:
shopt -s extglob # Allow extended globbing
var=" lakdjsf lkadsjf "
echo "${var//+([[:space:]])/}"
这是最快的,因为它使用内置函数而不是启动额外的进程。
但是,如果您想以符合 POSIX 的方式执行此操作,请使用 sed:
var=" lakdjsf lkadsjf "
echo "$var" | sed 's/[[:space:]]//g'
【讨论】:
shopt -s extglob。
从变量中删除所有空格的有趣方法是使用 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
我发布这个答案只是因为它很有趣,而不是在实践中使用它。
【讨论】:
myvar="$( set -f; printf "%s" $myvar )"; echo "[$myvar]"