【问题标题】:Alternative for sed ... <(cmd) and cmd | sedsed ... <(cmd) 和 cmd | 的替代方案sed
【发布时间】:2013-07-29 15:09:07
【问题描述】:

我想将命令设置为程序的配置选项。 有参数传递给命令。

但我希望将命令的输出替换为 sed。

原则上我想做这样的事情:

option = cmd <arg1> <arg2> | sed s/x/y/

但是选项只能这样设置:

 option = cmd

参数由程序自动附加。

所以我想像这样“反转”管道:

 option = sed s/x/y/ < <(cmd)

但是由于程序附加了参数,因此以下将 被执行:

 sed s/x/y/ < <(cmd) <arg1> <arg2>

但我想要

 sed s/x/y/ < <(cmd <arg1> <arg2>)

由于参数选项中没有占位符,我无法正确关闭括号。

有什么办法可以在不编写包装脚本的情况下解决这个问题?

【问题讨论】:

  • 如果你做option = "cmd arg1 args2"怎么办?也许这样所有东西都会放在&lt;(part)
  • 不,我只讲了 arg1 和 arg2 来说明我的意图。程序会自动将任何 arg1 和 arg2 附加到选项命令的末尾。下面的解决方案是完美的 - 谢谢!

标签: bash sed pipe


【解决方案1】:

如果你小心引用,你可以这样做:

option = bash -c 'cmd "$1" "$2" | sed "s/x/y/"' sub

末尾的“sub”一词是任意但必要的;之所以存在,是因为使用bash -c 创建的子shell 中的$1 实际上是第二个位置参数,而不是第一个。

【讨论】:

  • +1 出于个人喜好,我喜欢在您使用sub 的地方使用_。您会在 find . … -exec sh -c 'do stuff "$@"' _ {} + 等命令中看到很多
  • @kojiro:我也经常使用那个(或-),但是在一个例子中它太容易被忽略,而且很多cargoculters似乎认为它是某种特殊的语法,所以我尽量避免它在解释中。
  • 我在原始 sed 中需要 \s,所以我选择了 bash -c 'cmd "$1" "$2" | sed "s/^\\+\\+\\+\\\\s/+++/"' _,谢谢!
  • @metakeule:如果您使用的是 GNU sed,您应该可以不使用反斜杠将其写成 `sed -r "s/^[+]{3}[[:space:]] /+++/”。这是否更具可读性完全取决于个人。
猜你喜欢
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多