在终端让我们运行..
a=' aa a '
b=`echo $a | sed -e 's/^ *//g' -e 's/ *$//g'`
我相信它会从脚本的开头和结尾删除空格。
但保留了中间的空白空间
aa a
但是当我在 bash 脚本中运行它时..它返回
aaa
字符串之间的空格也被删除。
也许我需要逃避什么?
在终端让我们运行..
a=' aa a '
b=`echo $a | sed -e 's/^ *//g' -e 's/ *$//g'`
我相信它会从脚本的开头和结尾删除空格。
但保留了中间的空白空间
aa a
但是当我在 bash 脚本中运行它时..它返回
aaa
字符串之间的空格也被删除。
也许我需要逃避什么?
我不确定是什么导致了最后一个问题,但有一个更早的问题:引用没有双引号的变量会导致不必要的变量值解析。例如,该命令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'的值。可能它也被使用而没有双引号的好处,这会造成麻烦。
尝试这个 :
a=" space a a "
b=$(echo $a | sed -e 's/^\ *|\ *$//g')
echo "<$b>"
它将输出:
<space a a>