在linux shell中,下面的命令将递归搜索"this"的所有实例,并将其替换为"that"(我前面没有linux shell,但它应该有).

find . -name "*.txt" -print | xargs sed -i 's/this/that/g'

OSX上的类似命令会是什么样子?

推荐答案

OS X混合使用BSD和GNU工具,所以最好总是查看文档(尽管我听说less甚至不符合OS X手册):

https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html

sed将-i后面的参数作为备份的扩展.为无备份提供空字符串(-i '').

以下应该做:

find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +

-type f只是一种良好的实践;如果你给它一个目录,sed会抱怨的.

-exec优先于xargs;你不必为-print0或任何事而烦恼.

最后的{} +表示find将把所有结果作为参数附加到被调用命令的一个实例中,而不是 for each 结果重新运行它.(一个例外是操作系统允许的最大命令行参数数被 destruct ;在这种情况下,find将运行多个实例.)

如果出现"无效字节序列"之类的错误,可以通过在命令开头添加LC_ALL=C来强制使用标准语言环境,如下所示:

LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +

Linux相关问答推荐

UTF-8输入和使用XGetICValues

无法分析nasm中的单词

Git在某些文件中添加回车符,尽管autocrlf已关闭

Boost更新失败,现在不确定我有哪个版本

动态链接ELF文件是否需要ELF节头表?

如何摆脱管道分隔字段中不需要的管道符号 - Linux

用于替换 struct 文档中文本的 Bash 脚本

在 Ansible 中使用 JSON 查询过滤数据以从 ansible_fact 中提取数据

如何为 Linux 构建 Visual C++ 项目?

如何有效地使用 grep?

安装 mod_ssl 亚马逊 Linux

如何在 Linux 中为 C 或 C++ 的进程设置 CPU 亲和性?

size_t 和 off_t 的用法有什么区别?

nvm:无法卸载当前活动的 node 版本

如何告诉 valgrind 对Forking 进程进行 memcheck?

如何删除 Mercurial 存储库

Docker Bash 提示不显示 colored颜色 输出

以原子方式移动目录

如何从目录复制内容而不是符号链接?

内联 if shell 脚本