【问题标题】:Unix command to search and replace text recursively [closed]用于递归搜索和替换文本的 Unix 命令 [关闭]
【发布时间】:2014-01-03 12:44:20
【问题描述】:

我正在寻找一个 UNIX 命令,它可以帮助我递归地从文件夹中的所有文件中搜索文本并将其替换为新值。在互联网上搜索后,我发现了这个对我有用的命令。

找到 ./myFolder -type f -print0 | xargs -0 sed -i 's/Application/whatever/g'

请帮助我理解上述命令。我无法理解这部分命令:-print0 | xargs -0,这是什么意思?我只知道 Unix 的基础知识,所以很难理解这一点。我正在使用 bash shell。

还有在 Unix 中提供相同功能的任何替代命令,从谷歌搜索我得到了与 Perl 脚本相关的命令,我不知道 Perl 所以放弃了使用它的想法。

【问题讨论】:

  • 试试说man find, man xargs
  • man 页面正是为此目的:它们解释了当前操作系统中各种命令行标志的含义。
  • 有很多方法可以获得相同的功能。您可以编写一个脚本,递归地cds 到每个目录,greps 中的文件,执行 shell 替换并将结果写入 tmp 文件。或者,您可以使用递归 greo 或将 find 与 awk 一起使用,或者......您拥有的解决方案可能是最好的方法。

标签: regex bash shell recursion sed


【解决方案1】:

Also are there any alternate commands that provides same functionality in Unix

是的,您可以在 find 中完成所有这些操作:

find ./myFolder -type f -exec sed -i 's/Application/whatever/g' '{}' \;

find 中的-exec 选项用于:

-exec utility [argument ...] ;
如果名为实用程序的程序返回零值作为其退出状态,则为真。可选参数可以传递给实用程序。 表达式必须是 以分号 ('';'') 结束。如果你从 shell 调用 find ,你可能需要引用分号,如果 shell 会 否则将其视为 控制操作员。如果字符串 ''{}'' 出现在实用程序名称或参数中的任何位置,则将其替换为 当前文件。 实用程序将从执行 find 的目录中执行。效用和论据不受 进一步扩大外壳 模式和结构。

【讨论】:

  • 感谢 Anubhava,为什么我们在这个命令中需要 '{}' \;?你能告诉我吗?我的问题中的命令也使用-print0 来获取文件名,那么您建议的示例中不需要吗?请帮助我理解这一点。
  • Yes -print0 如果使用我建议的命令和-exec 选项,则不需要。 {} 是前面的 find 命令搜索的文件名的占位符。顺便说一句 -print0 prints the pathname of the current file to standard output, followed by an ASCII NUL characterxargs -0 进行管道传输
【解决方案2】:

find 正在通过给定路径中的所有文件 -type f 限制为文件(无文件夹,...) -print0 将输出与相应文件一起提供给标准输出

所以这会给你一个起点的所有文件和里面的所有子文件夹

xargs 允许您将参数传递给来自上一个命令的下一个命令(所以这里的文件名)

sed -i 编辑输入(这里是传递的文件) 's/Application/whatever/g' sed 命令在任何情况下将模式“Application”替换为“whatever”(g

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2012-08-24
    • 2021-09-20
    • 2019-12-23
    • 2011-06-26
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多