【发布时间】:2011-10-23 19:17:51
【问题描述】:
我对 bash 和其他一些人比较陌生,我在网上查看并找到了许多解决方案,可以在一定程度上满足我的需求,但我正在寻找最佳方法。
有些人使用sed,有些人使用find。
我正在尝试在目录中的所有文件中查找和替换某些内容(递归)。
关于如何做或在哪里看有什么建议吗?
编辑
我知道,现在,这与 SSH 没有直接关系,但这是我寻找答案的地方,我觉得其他人也可能会在同一个地方寻找。
【问题讨论】:
我对 bash 和其他一些人比较陌生,我在网上查看并找到了许多解决方案,可以在一定程度上满足我的需求,但我正在寻找最佳方法。
有些人使用sed,有些人使用find。
我正在尝试在目录中的所有文件中查找和替换某些内容(递归)。
关于如何做或在哪里看有什么建议吗?
编辑
我知道,现在,这与 SSH 没有直接关系,但这是我寻找答案的地方,我觉得其他人也可能会在同一个地方寻找。
【问题讨论】:
find . -type f | xargs -d "\n" perl -pi -e 's/search/replace/g'
find . -type f --> 递归查找当前目录中的所有文件。
xargs -d "\n" --> 这将使上述命令输出中的每一行作为下面部分的参数。
perl -pi -e 's/search/replace/g' ---> 这将从上述命令获取输入并处理每个文件以查找字符串并替换它。
【讨论】:
-d "\n" 参数添加到 xargs。我编辑了解决方案来纠正这个问题。此外,xargs 并没有将 find 的输出作为 perl 的 输入,而是将 find 的输出作为 perl 的参数。我也更正了。
-L some_number 以限制发送到 perl 的参数数量,从而避免达到参数限制shell 或 perl 中。
-p 选项使它的行为类似于 sed,所以为什么不在这里使用普通的 sed 将 perl -pi -e 's/search/replace/g' 替换为 sed -i -e 's/search/replace/g'。使用 sed 而不是 perl 将确保您的脚本在任何 UNIX 上运行,因为 sed 在 perl 不是的 UNIX 中是标准的。我不反对 perl,我认为它是一个很棒的工具,但我认为应该在其他标准工具不容易解决的地方使用它(为什么要使用 sed -n -e '1p',当你可以使用 head -n 1 时)。
“replace”是mysql自带的命令。我同意 mysql 附带的那个命令有点奇怪。大多数 linux 发行版要么已经安装了 mysql,要么只需点击几下即可安装。
语法是这样的:replace from1 to1 from2 to2 -- file1 file2 ...
from1 被 to1 替换,from2 被 to2 替换。 你可以有任意数量的对。仅替换 from1 到 to1:替换 from1 to1 -- file1 file2 ...
file1 file2 ... 是要搜索和替换的文件列表。 如果你在一个目录中,你希望递归地执行搜索和替换,你可以这样做:replace from1 to1 -- $(find -type f)
$() 执行括号内的命令并将其打印结果作为参数插入。回车替换为空格。
所以,假设用 with 将所有出现的单词“Mike”替换为单词“Joe”,并且您位于您希望开始的目录中,并递归地考虑所有文件:
替换 Mike Joe -- $(find -type f)
【讨论】:
find 可以在单个命令(无管道)中与另一个程序(例如 perl)结合使用。 基本上 find 会对每个匹配的文件执行 perl。
find . -type f -exec perl -pi -e 's/search/replace/g' {} \;
【讨论】: