linux - Mac 和 Linux 上的文本文件中的递归搜索和替换

在 linux shell 中,以下命令将递归搜索并用 'that' 替换所有 'this' 实例(我面前没有 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 '') 表示不进行备份。

以下应该做:

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

-type f 只是一个好习惯;如果你给它一个目录左右,sed 会提示。

-exec 优于 xargs;您不必为 -print0 或任何东西而烦恼。

末尾的 {} + 意味着 find 会将所有结果作为参数附加到被调用命令的一个实例,而不是为每个结果重新运行它. (一个异常(exception)是操作系统允许的最大命令行参数数量被破坏;在这种情况下,find 将运行多个实例。)

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

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

https://stackoverflow.com/questions/9704020/

相关文章:

c - 线程有不同的堆吗?

linux - 如何删除具有特定名称的文件夹

python - 在 SQLAlchemy 中使用 OR

python - 为什么在 Python 3 中 x**4.0 比 x**4 快?

python - pandas 获取不在其他数据框中的行

linux - 如何在 Bash 中运行超时的进程?

linux - 遍历 ls -l 输出的每一行

python - Windows Scipy 安装 : No Lapack/Blas Resourc

linux - 在 Linux 脚本中隐藏终端上的用户输入

python - 如何在python中声明零数组(或一定大小的数组)