find & sed(搜索和替换)

find & sed(搜索和替换)

我在我的 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 引号,例如"'(分别为0x220x27),因为您帖子中的示例包含非标准引号字符。如果你仔细观察,它们看起来有些不同。这很可能是来自 Word、OOWriter 甚至浏览器窗口等富文本文档格式的复制粘贴错误。

由于您使用的是 Mac,因此您很可能拥有 FreeBSD 实现sed,在这种情况下,您必须这样编写命令:

find . -name "*.java" -exec sed -i '' "s/foo/bar/g" {} +

(这里使用+而不是\;避免sed每个文件运行一次调用)。

请注意,如果或有空格,则周围的引号"s/foo/bar/g"是必需的。foobar

在 FreeBSD 中,sed-i标志的实现需要一个参数:备份文件的扩展名。例如,使用-i .bak该命令将首先备份file1.txtfile1.txt.bak然后再在原始文件中执行替换。使用空参数''意味着不使用备份文件,这似乎正是您想要的。

GNU(或 NetBSD、OpenBSD、busybox)实现中的相同内容是:

find . -name "*.java" -exec sed -i "s/foo/bar/g" {} +

谢谢@巴哈马特@米克尔@pieter-breed通过您的评论改进我的答案。

相关内容