使用字符串替换的命令替换

Command substitution with string substitution

是否可以按照以下方式做一些事情:

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

我很确定我在某个地方看到过类似的工作示例,但这会导致 "bad substitution" 错误。

我知道还有其他方法可以做到这一点,但这么短的 oneliner 会很有用。我是不是遗漏了什么或者这是不可能的?

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

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

或变量替换,全部解释 here,尤其是在 "Variable expansion / Substring replacement" 部分,下面是我的示例:

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

语法${...}只允许引用一个变量(或位置参数),可选择与parameter expansion.

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

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

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

请注意 嵌套 使用 $(...),这是优于 `...` 的主要优点之一,后者的使用需要逃离这里

就是说,您在命令替换中定义的任何变量都被限制在命令运行的 子外壳 中,因此 您可以只使用产生所需 output 的命令,因为只有 stdout 输出才是重要的。

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

为什么不

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