Bash变量替换

时间:2013-09-27 13:39:58

标签: bash

我有一个包含由空格分隔的四个数字的变量,例如:

a="12.3 423.4 11.0033 14.02"

但有时,我有一个尾随的空白:

a="12.3 423.4 11.0033 14.02 "

我想用“&”替换空格,为此,我这样做:

echo ${a// / & }

这给了我:

12.3 & 423.4 & 11.0033 & 14.02

或者如果我有一个尾随空格:

12.3 & 423.4 & 11.0033 & 14.02 & 

我的问题是我不知道我的字符串末尾是否有空格而且我不想要额外的“&”在任何情况下。什么是最优雅的方式来避免这个额外的角色?有没有办法说“如果一个空格和下一个字符替换一个数字”?

编辑:我知道我可以使用sed,但由于bash中存在变量替换机制,我想知道如何使用它来做我想要的事情。我不知道如何在bash替换中写出“not end of line”或“is a digit”。

5 个答案:

答案 0 :(得分:7)

如果有以下内容,这将删除尾随空格:

a=${a% }

然后你可以进行替换:

a=${a// / & }

答案 1 :(得分:1)

您可以使用sed并捕获匹配。

$ echo 12.3 423.4 11.0033 14.02 | sed 's/ [0-9]/ \&&/g'
12.3 & 423.4 & 11.0033 & 14.02

所以使用/ [0-9]/只会替换有空格后跟数字的位置。

如果你不想使用sed,你可以检查下一个字符是不是EOL。

${a// [^$]/ & }

答案 2 :(得分:1)

shopt -s extglob            # enable extended globbing patterns
b=${a/%+([[:blank:]])/}     # remove trailing whitespace
b=${b/#+([[:blank:]])/}     # remove leading whitespace
b=${b//+([[:blank:]])/ & }  # globally replace whitespace by " & "
echo ">$a<"
echo ">$b<"
>12.3 423.4 11.0033 14.02 <
>12.3 & 423.4 & 11.0033 & 14.02<

的引用:

http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

答案 3 :(得分:1)

这可能是一种人为的方法,但是FWIW。如果您可以使用单个&替换多个连续空格,则可以使用bash readprintf内置函数将字符串拆分为数组(假设默认空格为{{ 1}}用于拆分)然后使用IFS IFS的临时&加入,请参见下文。

a="12.3 423.4 11.0033 14.02 "
read -r -a x <<< "${a}"
IFS='&' eval 'printf -v a "%s" "${x[*]}"'
echo $a
12.3&423.4&11.0033&14.02

答案 4 :(得分:0)

也许你可以做到

a=`echo "12.3 423.4 11.0033 14.02 " | sed 's/ *$//'`
echo ${a// / & }

这样你就可以删除尾随的空格。