我需要替换一个文件夹中的许多文件中的字符串,只有ssh访问服务器。我该怎么做呢?


当前回答

当使用-i开关调用时,流编辑器确实会“inplace”修改多个文件,该开关以备份文件结尾作为参数。所以

sed -i.bak 's/foo/bar/g' *

在此文件夹中的所有文件中,将foo替换为bar,但不会下降到子文件夹中。但是,这将为目录中的每个文件生成一个新的.bak文件。 要递归地为该目录及其所有子目录中的所有文件执行此操作,您需要一个助手(如find)来遍历目录树。

find ./ -print0 | xargs -0 sed -i.bak 's/foo/bar/g' *

Find允许您进一步限制要修改的文件,通过指定进一步的参数,如Find ./ -name '*.php' -或name '*.html' -print0(如有必要)。


注意:GNU sed不需要文件结尾,sed -i 's/foo/bar/g' *也可以;FreeBSD sed要求扩展,但允许中间有一个空格,因此sed -i .bak s/foo/bar/g *可以工作。

其他回答

我从另一篇文章中找到了这篇文章(不记得是哪篇了),虽然不是最优雅的,但它很简单,作为一个新手Linux用户,它没有给我带来任何麻烦

for i in *old_str* ; do mv -v "$i" "${i/\old_str/new_str}" ; done

如果有空格或其他特殊字符,请使用\

for i in *old_str\ * ; do mv -v "$i" "${i/\old_str\ /new_str}" ; done

对于子目录中的字符串使用**

for i in *\*old_str\ * ; do mv -v "$i" "${i/\old_str\ /new_str}" ; done

要替换文件中的路径(避免转义字符),您可以使用以下命令:

sed -i 's@old_path@new_path@g'

@符号意味着在接下来的字符串中所有的特殊字符都应该被忽略。

当使用-i开关调用时,流编辑器确实会“inplace”修改多个文件,该开关以备份文件结尾作为参数。所以

sed -i.bak 's/foo/bar/g' *

在此文件夹中的所有文件中,将foo替换为bar,但不会下降到子文件夹中。但是,这将为目录中的每个文件生成一个新的.bak文件。 要递归地为该目录及其所有子目录中的所有文件执行此操作,您需要一个助手(如find)来遍历目录树。

find ./ -print0 | xargs -0 sed -i.bak 's/foo/bar/g' *

Find允许您进一步限制要修改的文件,通过指定进一步的参数,如Find ./ -name '*.php' -或name '*.html' -print0(如有必要)。


注意:GNU sed不需要文件结尾,sed -i 's/foo/bar/g' *也可以;FreeBSD sed要求扩展,但允许中间有一个空格,因此sed -i .bak s/foo/bar/g *可以工作。

在MacBook Pro上,我使用了以下方法(灵感来自https://stackoverflow.com/a/19457213/6169225):)

sed -i '' -e 's/<STR_TO_REPLACE>/<REPLACEMENT_STR>/g' *

-i "将确保您没有备份。 -e表示现代正则表达式。

对于这个问题,已经列出了一些标准答案。通常,您可以使用find来递归地列出文件,然后使用sed或perl执行操作。

rpl

对于大多数快速使用,您可能会发现rpl命令更容易记住。

在所有。txt文件上用bar替换foo:

rpl -v foo bar '*.txt' 

模拟替换正则表达式foo。*在所有.txt文件中递归地使用bar:

rpl --dry-run 'foo.*' bar '**/*.txt'

您可能需要安装它(apt-get install rpl或类似的方法)。

repren

然而,对于涉及正则表达式和反向替换,或文件重命名以及搜索和替换的更困难的工作,我所知道的最通用和最强大的工具是repren,这是我不久前为一些棘手的重命名和重构任务编写的一个小Python脚本。你可能更喜欢它的原因是:

支持重命名文件以及搜索和替换文件内容。 在执行搜索和替换之前查看更改。 支持带有反向替换、整词、大小写不敏感和保留大小写(replace foo -> bar, foo -> bar, foo -> bar)模式的正则表达式。 适用于多个替换,包括互换(foo -> bar和bar -> foo)或非唯一替换集(foo -> bar, f -> x)。

使用它,pip安装repren。查看README中的示例。