2

在终端让我们运行..

a=' aa a '
b=`echo $a | sed -e 's/^ *//g' -e 's/ *$//g'`

我相信它会从脚本的开头和结尾删除空格。
但保留了中间的空白空间

aa a

但是当我在 bash 脚本中运行它时..它返回

aaa

字符串之间的空格也被删除。

也许我需要逃避什么?

4

2 回答 2

0

我不确定是什么导致了最后一个问题,但有一个更早的问题:引用没有双引号的变量会导致不必要的变量值解析。例如,该命令echo $a将替换 $a 的值,然后执行分词(删除租赁和尾随空格,并将变量中的空格转换为分词),然后如果任何单词包含通配符,则进行 glob(又名通配符)扩展. (然后echo将接收到的“单词”与它们之间的单个空格一起粘贴回去。)echo "$a"另一方面,完整地回显了 $a 的值:

$ a='    a    *    aa    '   # Note multuple spaces and a wildcard
$ echo $a "end"    # "end" is there so you can tell if the trailing spaces are echoed
a file1.txt file2.txt file3.pdf aa end
$ echo "$a" "end"
    a    *    aa     end

因此,b=$(echo $a | sed -e 's/^\ *|\ *$//g')$a 中的前导和尾随空格在字符串到达​​之前就被删除了sed。如果这是唯一已经完成的事情,那会很好,但正如您在上面看到的那样,字符串也以其他(不受欢迎的)方式被弄乱了。

据我所见,sed只要您将 $a 的未修改值传递给它,该命令就会完全按照它应该做的事情:

$ b=$(echo "$a" | sed -e 's/^ *//g' -e 's/ *$//g')
$ echo "$b" "end"    # Note that echo will put a single space between $b and "end"
a    *    aa end
$ echo "'$b'"    # Here's a more direct way to mark the beginning and end of the string
'a    *    aa'

...所以在我看来,其他东西(可能在引用的代码之后)正在弄乱'$b'的值。可能它也被使用而没有双引号的好处,这会造成麻烦。

于 2013-08-30T22:45:37.247 回答
0

尝试这个 :

a="   space a a   " 
b=$(echo $a | sed -e 's/^\ *|\ *$//g') 
echo "<$b>"

它将输出:

<space a a>
于 2013-08-29T13:54:45.250 回答