查找并保存(搜索并替换)


26

我在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 .

2
这正是您所运行的吗?如果您删除-exec和之后的所有内容怎么办?它会打印Java文件的名称吗?(我担心您使用的是智能引号而不是ASCII引号。)
Mikel 2012年

1
实际上,这至少对我来说解决了。双引号和单引号均应分别用"和代替'
Lev Levitsky

2
智能(?)报价!.. :)
Peter.O 2012年

我粘贴的正是我正在运行的内容。有人可以发布答案吗?
阿米尔·阿富汗尼

1
下次,当您问问题时,请张贴您看到的错误消息。它将为每个人节省时间。
Mikel

Answers:


34

首先,请确保在外壳程序脚本中使用常规的ascii引号,例如"和和'(分别为ascii代码0x220x27),因为帖子中的示例包含非标准的引号字符。如果仔细观察,它们看起来会有所不同。这很可能是来自富文本文档格式(如Word,OOWriter甚至浏览器窗口)的复制粘贴错误。

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

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

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

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

GNU(或NetBSD,OpenBSD,busybox)实现中的同一件事是:

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

谢谢@bahamat@Mikel@ pieter-breed改进了我对您的评论的回答。


花括号做什么?
Zane Hitchcox '18年

3
@ZaneHitchcox大括号是匹配文件名的占位符
停止对Monica的持续伤害
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.