我正在尝试使用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
这是运行脚本后目录的前后屏幕截图。被替换的文件仍然存在,它们被隐藏了吗?
答案 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]
。
在这种情况下,可能有两种合理的解决方案。
我发现的最简单的解决方法是简单地使用perl。语法几乎相同:
sed -i -e 's/foo/bar/g' $file
->
perl -pi -e 's/foo/bar/g' $file