【问题标题】:How to use xargs with ed?如何将 xargs 与 ed 一起使用?
【发布时间】:2019-04-12 16:35:33
【问题描述】:

我想在一个文件夹中递归地批量替换字符串,我已经决定使用 Perl。我想看看是否有一个需要较少依赖和跨平台工作的解决方案。

对于列出文件,我可以使用从 lsfindagrg 的任何内容。让我用ls 演示我的问题。

ls | xargs -I '{}' ed -s {} <<< $'='

我会得到这个:

Is a directory newline appended =: No such file or directory

由于管道用于将文件名传递给xargs,并且流(此处为字符串)似乎不起作用(How can heredocs be used with xargs?)。我想知道是否可以使用xargsed

我关心的是跨平台,事实上该命令将放在package.json 中,用于npm run global_replace。我们想知道除了为这个任务引入gulp-replacegulp 之外是否还有其他解决方案。

【问题讨论】:

  • 你想在 ed 中运行什么命令? $'=' 被 shell(ANSI-C 引用)缩减为 =,并将打印当前行的行号,即最后一行。
  • @BenjaminW。对不起,不好的例子。另一个可能是$'2,5d\nw',即删除这些行并保存。我的意思是证明 herestring 不起作用。

标签: pipe xargs heredoc ed herestring


【解决方案1】:

试试这个解决方案:

find . -name "*" | xargs sed -i 's/regex/replacestring/g'

【讨论】:

  • 谢谢!我曾经认为sed 足够独立于平台。然而 sed 对于“自然”Linux 设置和 MacOS 是不同的,即使使用 sed -i '' '...' 也有非法字节需要 LC_ALL=C 来转换行尾。希望ed 表现更好。
【解决方案2】:

经过一番调查,使用herestring并非完全不可能:

find ... | xargs -0 -I{} sh -c 'ed -s "$1" <<< '"$',s/foo/bar/g\nw'" -- {}

package.json 中,我必须转义每个",所以现在我们可以运行npm run replace。退出代码将是状态 1,虽然它可以工作,但它看起来并不好。

非常感谢 @Benjamin.W 对 cme​​ts 的帮助!

【讨论】:

  • 您可以将参数的一部分移动到sh -c 以被双引号,其余的被单引号,像这样:sh -c 'ed -s "$1" <<< '"$',s/foo/bar/g\nw'"。请务必引用$1,否则-print0xargs -0 的全部好处将再次丢失。
  • "newline appended" 表示该文件的最后一行没有换行符,而 ed 添加了一个换行符。根据 POSIX,一些编辑器会创建这样的文件,但他们不应该这样做。
猜你喜欢
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
相关资源
最近更新 更多