【发布时间】:2013-04-02 22:51:48
【问题描述】:
为什么这不起作用?
$ s="-e 's/^ *//' -e 's/ *$//'"
$ ls | sed $s
sed: 1: "'s/^
": invalid command code '
$ ls | gsed $s
gsed: -e expression #1, char 1: unknown command: `''
但这确实:
$ ls | eval sed $s
... prints staff ...
$ ls | eval gsed $s
... prints staff ...
尝试从 $s 中删除单引号,但它仅适用于没有空格的模式:
$ s="-e s/a/b/"
$ ls | sed $s
... prints staff ...
$ s="-e s/^ *//"
$ ls | sed $s
sed: 1: "s/^
": unterminated substitute pattern
或
$ s="-e s/^\ *//"
$ ls | sed $s
sed: 1: "s/^\
": unterminated substitute pattern
Mac OS 10.8、bash 4.2、Mac 端口的默认 sed 和 gsed 4.2.2
【问题讨论】:
-
第一种情况,变量展开后,其值中的单引号没有特殊意义——即不再被视为引号。当您评估它时,您正在对扩展字符串进行第二次传递,然后单引号被识别为重要。
-
希望这只是一个出于好奇的问题,您实际上并没有考虑这样做。
-
其实我是。我正在动态计算模式,然后在流中使用它们。
标签: bash shell variables sed expansion