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

问题描述 投票:0回答:3

我知道这个问题已经有一个重复的问题。如何从一个Bash变量中修剪空格?.

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

这是我认为可行的解决方案。

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

下面是一个演示。

$ a="  foo  "
$ a=$(printf "%s" $a)
$ echo "$a"
foo
  1. 有没有什么情况下,这个解决方案可能会失败?
  2. 如果有这样的场景,这个解决方案可能会失败,我们是否可以在不太影响解决方案的简单性的前提下,修改这个解决方案来处理这个场景?
shell posix
3个回答
0
投票

如果变量a在一开始就设置了类似"-e", "-n "这样的选项,根据你以后如何处理你的结果,用户可能会破坏你的脚本:-e选项允许echo解释反斜线的东西。

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

你可以考虑使用regex来检查你的变量是否以'-'开头,并且后面跟着一个可用的echo选项(-n, -e, -E, --help, --version)。


0
投票

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

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

预期的输出是下面的结果。

foo  bar

0
投票

你可以使用Bash内置的模式替换。注意: Bash模式替换使用 "路径名扩展"(glob)模式匹配, 而不是正则表达式. 我的解决方案需要启用可选的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部分的 "参数扩展"(模式替换)和 "路径名扩展 "子节。

© www.soinside.com 2019 - 2024. All rights reserved.