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

标签 regex bash macos 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 .

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

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

enter image description here

最佳答案

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

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

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

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

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

关于regex - sed 命令使用 -e 扩展名创建不需要的文件副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34533893/

相关文章:

python - 如何在Python的正则表达式中正确使用中文字符?

arrays - 检查元素是否存在于 Bash 数组中

linux - 使用 sed 命令格式化输出

objective-c - 在 NSTableView 运行时计算组行

regex - 我的正则表达式有什么问题?

正则表达式获取两个字符之间的文本

javascript - 用于从 JS 中的 HTML 标记中删除 id、样式、类属性的正则表达式

bash - bash 脚本的条件部分中的 EOT

c++ - 无法正确传递 char 数组

macos - 在 Mac OS X 上使用不同的配置文件打开多个 firefox 实例