用字符串替换命令替换

时间:2015-05-10 00:32:25

标签: bash command-substitution

是否可以采取以下措施:

echo ${$(ls)/foo/bar}

我很确定我在某个地方找到了类似的例子,但这会导致“错误替换”错误。

我知道还有其他方法可以做到这一点,但这样一个简短的oneliner会很有用。我错过了什么或者这不可能吗?

3 个答案:

答案 0 :(得分:4)

语法${...} 仅允许引用变量(或位置参数),可选择与parameter expansion 结合使用。

语法$(...) (或者,不太优选地,它的旧式等价物,`...`)执行 command substitution 允许嵌入任意命令标准输出表达式展开

因此,您可以组合这两个功能,如下所示:

echo "$(lsOutput=$(ls); echo "${lsOutput//foo/bar}")"

注意$(...)的简单嵌套使用,这是`...`的主要优势之一,其使用需要在此处转义。

也就是说,你在命令替换中定义的任何变量都被限制在命令运行的子shell 中,所以你只能用一个产生所需<的命令来做em> output ,因为它只是重要的标准输出。

echo "$(ls | sed 's/foo/bar/')"

答案 1 :(得分:2)

您可以将管道|sed一起使用,例如:

$ echo ABC | sed 's/B/_/'
A_C

或变量替换,全部解释here,尤其是“变量扩展/子串替换”部分,以及我的示例:

$ var=ABC
$ echo ${var//B/_}
A_C

答案 2 :(得分:0)

为什么不只是

root@localhost:~# echo `pwd`_whatever_suffix
/root_whatever_suffix