【问题标题】:sed command creating unwanted duplicates of file with -e extensionsed 命令使用 -e 扩展名创建不需要的文件副本
【发布时间】:2016-04-04 16:27:42
【问题描述】:

我正在尝试使用 shell 脚本对目录中的 java 文件进行递归查找和替换。它可以工作,但它隐藏了所有文件,并使用 -e 扩展名创建副本

#!/bin/bash
for file in $(find . -type f -name "*.java")
do sed -i -e 's/foo/bar/g' $file
done

据我了解,-e 是可选的 - 但如果我不提供它,我会在它找到的每个文件上收到以下错误

sed: 1: "./DirectoryAdapter.java": invalid command code .

有什么线索吗?作为参考,我在运行 El Capitan 的 Mac OS X 上

这是运行脚本后目录的前后截图。被替换的文件还存在,被隐藏了?

【问题讨论】:

    标签: regex bash macos shell sed


    【解决方案1】:

    接受的答案适用于 OSX,但如果您的代码同时在 GNU 和 OSX 系统上运行,则会出现问题,因为它们分别需要 -i[SUFFIX]-i [SUFFIX]

    在这种情况下,可能有两种合理的解决方案。

    1. 不要使用 -i(就地)。而是通过管道传输到一个临时文件并在之后覆盖原始文件。
    2. 使用 perl。

    我发现最简单的解决方法是简单地使用 perl。语法几乎相同:

    sed -i -e 's/foo/bar/g' $file

    ->

    perl -pi -e 's/foo/bar/g' $file

    【讨论】:

      【解决方案2】:

      在 OSX sed (BSD) 上,sed 需要在 -i 选项之后进行扩展。因为它之后会找到-e,所以它会将-e 添加到每个输入文件名中。顺便说一句,您甚至不需要 -e 选项。

      你可以像这样传递一个空的扩展:

      sed -i '' 's/foo/bar/g' $file
      

      或者使用.bak作为扩展名来保存原始文件:

      sed -i.bak 's/foo/bar/g' $file
      

      【讨论】:

      • 优秀。我怀疑这就是正在发生的事情,但没有意识到我可以通过一个空的扩展名。非常感谢
      • 我认为我尝试组合这些选项很聪明,所以我使用了类似sed -iE ... 的东西,并且得到了一堆文件末尾附有E。花了我一段时间才看到相关性,谢谢你的回答
      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 2016-10-04
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多