下面的 sed 命令有助于将文本添加Hello
到输入的每一行的末尾
<complex_query> | sed "s,$,Hello,"
Output:
myvar1: Hello
myvar2: Hello
我现在希望输出grep wow data.txt | cut -d: -f2
代替Hello
这怎么可能?
以下是我尝试过但不起作用的东西。
<complex_query> | sed "s,$,(grep wow data.txt | cut -d: -f2),"
预期的期望输出:
myvar1: <output of grep wow data.txt | cut -d: -f2 command>
myvar2: <output of grep wow data.txt | cut -d: -f2 command>
要在另一个命令的参数中使用命令的输出(减去尾随换行符),您可以使用命令替换,这是 Bourne shell 在 70 年代后期引入的功能。
在 Bourne shell 中,语法是
`cmd...`
. 也是如此csh
。在现代
sh
和sh
类似的 shell 中,例如ksh
(它来自哪里)¹、、、、zsh
基于的 shell,语法是bash
相反的(尽管它们也支持 Bourne 语法以实现向后兼容性)。ash
$(...)
在
rc
-like shell 中,语法是`{cmd...}
在
fish
shell 中,它(cmd ...)
虽然不能在双引号内使用。从 3.4.0 版本开始,fish
还支持$(cmd...)
可以在双引号内使用的 which。命令替换通常以不同的方式拆分命令的输出,从而在 shell 之间产生多个传递给命令的参数,其中一些(包括大多数 Bourne-like shell)甚至对生成的单词(!)执行 globbing。这通常可以通过将命令替换放在双引号内来防止(不是在
rc
-like shells² 中,也不是在fish
< 3.4.0³ 中)。所以在这里:
类似 POSIX 的 shell 或
fish
3.4.0+:rc
- 类似贝壳:csh
/tcsh
:fish
< 3.4.0现在,请注意
&
and字符在'命令\
的替换部分中是特殊的,因此必须与(此处使用的分隔符)和换行符(如果存在换行符)一起转义(如果可以存在换行符,请注意拆分/为如上所述)。sed
s
\
,
csh
rc
请参阅如何确保插入到 `sed` 替换中的字符串转义所有关于此的元字符。
另一种方法是使用
perl
而sed
不是不必担心特殊字符:(这里假设一个类似 POSIX 的外壳)
甚至让
perl
collectcmd
的输出本身(使用它自己的`...`
,并修剪一个尾随换行符,如果有的话chomp
)。¹
ksh93
和最新版本mksh
还支持一种${ ...; }
与其他形式不同的形式,但fish
不引入 subshell 环境。²
rc
-like shell 只有一种类型的引号:'...'
它们是强引号(内部不能发生扩展)。您可以通过使用``(){cmd ...}
(使用``(sep1 sep2){cmd ...}
您指定要拆分的分隔符列表的语法,此处为空)来防止拆分,但这也会阻止尾随换行符修剪。³ 另请注意,在 csh/tcsh 中,
"`cmd ...`"
仍会在换行符处拆分。