使用字符串替换的命令替换
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
是否可以按照以下方式做一些事情:
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