【发布时间】:2013-10-20 10:57:10
【问题描述】:
我正在尝试在 sed 中使用 shell 通配符。以下失败。 (我希望 foo 作为输出。)
$ touch foo
$ ls
foo
$ echo *
foo
$ bar=*
$ echo $bar
foo
$ echo "$bar"
*
$ echo replace | sed "s/replace/${bar}/"
*
$ echo replace | sed "s/replace/"${bar}"/"
*
正如预期的那样,倒数第二个命令不会产生foo,因为${bar} 是(双)引用的。但是,我希望最后一个命令扩展通配符。
我可以在以下之后让任一命令工作。
bar=$(echo *)
此外,我预计下面的 shell 通配符扩展不会发生。
$ echo replace | sed s/replace/*/
*
但是,这行得通。
$ echo replace | sed s/replace/$(echo *)/
qwe
【问题讨论】:
-
那是因为
*单独不是命令,但echo *是,shell 将echo *理解为命令并在sed开始工作后用它替换结果。 -
你试过这个命令了吗?:
echo replace | sed s/replace/$(echo ${bar})/(在子shell中启动echo,它的stdout进入你的sed命令) -
@snyder 真的吗?但我并没有真正看到命令
echo和命令sed之间的区别。同样,您可以在find中使用*等。我认为bash 总是会扩展。 -
@Gooseman 是的,这也有效。
标签: bash shell sed wildcard glob