我在我的 mac 上使用以下命令:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
而且似乎没有效果。
我的目录中有两个以 .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 .
答案1
首先,确保您在 shell 脚本中使用常规的 ascii 引号,例如"
和'
(分别为0x22
和0x27
),因为您帖子中的示例包含非标准引号字符。如果你仔细观察,它们看起来有些不同。这很可能是来自 Word、OOWriter 甚至浏览器窗口等富文本文档格式的复制粘贴错误。
由于您使用的是 Mac,因此您很可能拥有 FreeBSD 实现sed
,在这种情况下,您必须这样编写命令:
find . -name "*.java" -exec sed -i '' "s/foo/bar/g" {} +
(这里使用+
而不是\;
避免sed
每个文件运行一次调用)。
请注意,如果或有空格,则周围的引号"s/foo/bar/g"
是必需的。foo
bar
在 FreeBSD 中,sed
该-i
标志的实现需要一个参数:备份文件的扩展名。例如,使用-i .bak
该命令将首先备份file1.txt
,file1.txt.bak
然后再在原始文件中执行替换。使用空参数''
意味着不使用备份文件,这似乎正是您想要的。
GNU(或 NetBSD、OpenBSD、busybox)实现中的相同内容是:
find . -name "*.java" -exec sed -i "s/foo/bar/g" {} +
谢谢@巴哈马特和@米克尔和@pieter-breed通过您的评论改进我的答案。