【问题标题】:output of one command is argument of another一个命令的输出是另一个命令的参数
【发布时间】:2010-05-06 03:25:45
【问题描述】:

有没有办法使用以下管道安装在 1 行中:

输出

sha1sum $(xpi) | grep -Eow '^[^ ]+'

代替 456

sed 's/@version@/456/' input.txt > output.txt

【问题讨论】:

  • 你不能使用管道来获取命令行参数的输出;给出的答案都有效,但我会使用(另一个)乔纳森的双引号。
  • @Jonathan Leffler:sed 不能很好地在这些双引号中嵌套另一个命令。它会在 shell 尝试解析出要执行的命令之前尝试不正确地解析它。
  • @Trey:你是什么意思? $(...) 符号中的命令将在 sed 启动之前完全执行!
  • @Jonathan Leffler:尝试执行` | sed -e 's/(\/\|\\\|&)/\\&/g'. The output will be something like sed: -e expression #1, char 9: 's'`的未知选项。
  • @Trey:我们在谈论不同的目的——我看不出你刚刚写的内容与其余讨论有何联系。如果您想进一步讨论,请通过电子邮件与我联系(请参阅我的个人资料)。否则,我们会将其视为误传。

标签: unix shell sed pipe


【解决方案1】:

嗯,我认为你可以嵌套 $(command arg arg) 出现,所以如果你真的只需要一行,试试

 sed "s/@version@/$(sha1sum $(xpi) | grep -Eow '^[^ ]+')/" input.txt \
     > output.txt

但我喜欢 Trey 的解决方案,将其放在一行两行;它不那么令人困惑。

【讨论】:

  • @Trey: sed 不会看到 $; shell 将在尝试运行 sed 之前执行 sha1sum $(xpi) | grep ...,并将 sha1sum | grep 的输出嵌入到命令行中。
【解决方案2】:

使用管道这是不可能的。但是命令嵌套有效:

sed 's/@version@/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+')'/' input.txt > output.txt

另请注意,如果嵌套命令的结果包含 / 字符,您将需要使用不同的字符作为分隔符(#|$_ 是常用字符)或以某种方式转义字符串中的正斜杠。 This StackOverflow question 也有逃逸问题的解决方案。该问题可以通过将命令传递给 sed 并替换所有正斜杠(用于转义字符)和反斜杠(以避免与使用 / 作为外部 sed 分隔符发生冲突)来解决。

以下正则表达式将转义命令中的所有\ 字符和所有/ 字符:

sha1sum $(xpi) | grep -Eow '^[^ ]+' | sed -e 's/\(\/\|\\\|&\)/\\&/g'

像我们上面所做的那样嵌套它,我们得到了这个解决方案,它应该在需要的地方正确地转义斜线:

sed 's/@version@/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+'  | sed -e 's/\(\/\|\\\|&\)/\\&/g')'/' input.txt > output.txt

我个人认为这看起来像一条线,但它确实有效。

【讨论】:

  • @Trey:是的,我知道那个,所以在one line 中没有办法做到这一点,也许使用管道?
  • @Michael:对不起,我误读了你的问题。我只是将其修改为在一行中工作。我不相信管道是可能的,因为您需要生成一个子命令,而不是将输出直接重定向到另一个命令的输入(这就是管道的用途)
  • @Michael:我的第一个解决方案不使用分号。在这种情况下,它使用最接近“管道”的命令嵌套。
  • @Trey:是的,这个就像一个魅力。有没有办法以某种方式逃避/?因为可能有其他命令而不是 sha1sum,我真的不知道输出?
  • @Michael:我刚刚修改了问题并添加了一个解决方案,该解决方案应该在嵌套命令的命令输出中转义 / 和 `` 字符。
猜你喜欢
  • 2012-10-25
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
相关资源
最近更新 更多