nse*_*ror 11 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
Run Code Online (Sandbox Code Playgroud)
根据我的理解,-e是可选的 - 但如果我不提供它,我会在它找到的每个文件上收到以下错误
sed: 1: "./DirectoryAdapter.java": invalid command code .
Run Code Online (Sandbox Code Playgroud)
任何线索,因为这里发生了什么?作为参考,我在运行El Capitan的Mac OS X上
这是运行脚本后目录的前后屏幕截图.被替换的文件仍然存在,它们被隐藏了吗?
anu*_*ava 17
在OSX sed(BSD)上sed需要一个扩展-i选项.由于-e之后发现它正在添加-e到每个输入文件名.顺便说一下,你甚至不需要-e选择.
你可以像这样传递一个空的扩展名:
sed -i '' 's/foo/bar/g' $file
Run Code Online (Sandbox Code Playgroud)
或者.bak用于扩展以保存原始文件:
sed -i.bak 's/foo/bar/g' $file
Run Code Online (Sandbox Code Playgroud)
接受的答案适用于 OSX,但如果您的代码在 GNU 和 OSX 系统上运行,因为它们分别期望-i[SUFFIX]和会导致问题-i [SUFFIX]。
在这种情况下,可能有两种合理的解决方案。
我发现最简单的解决方法是简单地使用 perl。语法几乎相同:
sed -i -e 's/foo/bar/g' $file
->
perl -pi -e 's/foo/bar/g' $file