下面的语句应该打印, afc abc
但它却打印了 abc abc
。我尝试了很多次,但每次的结果都是一样的,不知道为什么会发生这种情况,有人可以解释并帮助我吗?
echo abc|xargs -i{} echo $(echo {}|sed 's/b/f/g') {}
答案1
是的,确实如此,因为命令替换是由 shell 在xargs
启动之前执行的。替换中的打印要操作的echo
文字字符串。不对其进行任何更改,结果是看到{}
sed
sed
xargs
echo {} {}
反而:
echo 'abc' | xargs -I{} bash -c 'echo "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}
在这里,我们通过将命令替换嵌入到内联脚本中来防止 shell 评估命令替换。该脚本从 中获得命令行参数 ( abc
)xargs
并将其操作为"$1"
。
printf
如果您想用a
破折号和其他字符替换为可被解释为选项的内容,那么使用它会更好echo
:
echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}
或者,没有sed
:
echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "${1//b/f}" "$1"' bash {}
或者,您可以单独完成sed
(至少在这个简单的示例中):
echo 'abc' | sed 'h; s/b/f/g; G; s/\n/ /'