sed命令使用-e扩展名创建不需要的文件副本

时间:2015-12-30 17:06:47

标签: macos bash shell sed

我正在尝试使用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 .

任何线索,因为这里发生了什么?作为参考,我在Mac OS X上运行El Capitan

这是运行脚本后目录的前后屏幕截图。被替换的文件仍然存在,它们被隐藏了吗?

enter image description here

2 个答案:

答案 0 :(得分:13)

在OSX sed(BSD)sed上需要-i选项后的扩展名。由于之后发现-e,因此会在每个输入文件名中添加-e。顺便说一下,你甚至不需要-e选项。

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

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

或使用.bak作为保存原始文件的扩展程序:

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

答案 1 :(得分: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