find & sed(搜索和替换)

Ami*_*ani 46 osx sed find

我在我的 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 代码0x220x27),因为您帖子中的示例包含非标准引号字符。如果仔细观察,它们看起来有点不同。这很可能是来自富文本文档格式(如 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通过您的评论改进我的回答。

  • @ZaneHitchcox 花括号是匹配文件名的占位符 (4认同)
  • @Anthony 最后的“+”终止了“-exec”选项的参数列表。它是 `-exec` 语法所必需的。 (3认同)
  • 花括号有什么作用? (2认同)