我在我的 mac 上使用以下命令:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
Run Code Online (Sandbox Code Playgroud)
而且似乎没有效果。
我在目录中有两个以 .java 结尾的文件,它们都包含 foo 文本。我错过了什么吗?
编辑:征求意见的结果
[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.java": invalid command code .
sed: 1: "./foo.java": invalid command code .
Run Code Online (Sandbox Code Playgroud)
jan*_*nos 58
首先,请确保您在 shell 脚本中使用常规的 ascii 引号,如"和'(分别为ASCII 代码0x22和0x27),因为您帖子中的示例包含非标准引号字符。如果仔细观察,它们看起来有点不同。这很可能是来自富文本文档格式(如 Word、OOWriter 甚至浏览器窗口)的复制粘贴错误。
由于您使用的是 Mac,您很可能拥有 FreeBSD 的 实现sed,在这种情况下,您必须以这种方式编写命令:
find . -name "*.java" -exec sed -i '' s/foo/bar/g {} +
Run Code Online (Sandbox Code Playgroud)
(这里使用+而不是\;避免sed每个文件运行一次调用)。
在 FreeBSD 实现中,sed该-i标志需要一个参数:备份文件的扩展名。例如用-i .bak该命令将备份file1.txt作为file1.txt.bak第一执行原始文件的替换之前。使用空参数''意味着不使用备份文件,这似乎是您想要的。
在 GNU(或 NetBSD、OpenBSD、busybox)实现中,同样的事情是:
find . -name "*.java" -exec sed -i s/foo/bar/g {} +
Run Code Online (Sandbox Code Playgroud)
感谢@bahamat和@Mikel以及@pieter-breed通过您的评论改进我的回答。