如何从变量中的字符串值修剪前导和尾随空格?

时间:2015-03-26 08:33:05

标签: shell posix

我知道此问题已存在重复:How to trim whitespace from a Bash variable?

我在那里阅读了所有的答案,但我有一个关于我心中的另一个解决方案的问题,我想知道这是否有效。

这是我认为有效的解决方案。

a=$(printf "%s" $a)

这是一个演示。

$ a="  foo  "
$ a=$(printf "%s" $a)
$ echo "$a"
foo
  1. 是否存在此解决方案可能失败的情况?
  2. 如果存在此解决方案可能失败的情况,我们是否可以修改此解决方案以处理该方案而不会过多地影响解决方案的简单性?

3 个答案:

答案 0 :(得分:0)

如果变量a设置为" -e"," -n"在开始时,根据您以后处理结果的方式,用户可能会崩溃您的脚本: -e选项允许echo解释反向事物。

即使在你只想显示变量a的情况下,-n也会拧紧你的布局。

你可以考虑使用正则表达式检查你的变量是否以' - '然后是一个可用的echo选项(-n,-e,-E, - help, - version)。

答案 1 :(得分:0)

当输入在非空白字符之间包含空格时,它会失败。

$ a="  foo  bar  "
$ a=$(printf "%s" $a)
$ echo "$a"
foobar

预期的输出是以下。

foo  bar

答案 2 :(得分:0)

您可以使用Bash的内置模式替换。 注意:Bash模式替换使用“路径名扩展”(全局)模式匹配,而不是正则表达式。我的解决方案要求启用可选的shell行为extglob(shopt -s extglob)。

$shopt -s extglob
$ a="  foo bar  "
$ echo "Remove trailing spaces: '${a/%*([[:space:]])}'"
Remove trailing spaces: '  foo bar'
$ echo "Remove leading spaces: '${a/#*([[:space:]])}'"
Remove leading spaces: 'foo bar  '
$ echo "Remove all spaces anywhere: '${a//[[:space:]]}'"
Remove all spaces anywhere: 'foobar'

有关参考,请参考Bash手册页EXPANSION部分的“ Parameter Expansion”(模式替换)和“ Pathname Expansion”子部分。