我需要在一个目录中的所有文件和子目录中递归地搜索指定的字符串,并用另一个字符串替换此字符串。

我知道查找它的命令可能是这样的:

grep 'string_to_find' -r ./*

但是如何用另一个字符串替换string_to_find的每个实例呢?


当前回答

以下是我的做法:

find /path/to/dir -type f -iname "*filename*" -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'

这将查找所有包含文件名在/路径/到/dir下的文件名的文件,而对于每一个找到的文件,搜索搜索字符串并将旧文件替换为新文件。

但是如果你想忽略查找文件名中有文件名字符串的特定文件,可以简单地执行:

find /path/to/dir -type f -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'

这将执行与上面相同的操作,但是针对/path/to/dir下的所有文件。

其他回答

我得到了答案。

grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'

以下是我的做法:

find /path/to/dir -type f -iname "*filename*" -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'

这将查找所有包含文件名在/路径/到/dir下的文件名的文件,而对于每一个找到的文件,搜索搜索字符串并将旧文件替换为新文件。

但是如果你想忽略查找文件名中有文件名字符串的特定文件,可以简单地执行:

find /path/to/dir -type f -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'

这将执行与上面相同的操作,但是针对/path/to/dir下的所有文件。

这在OS X上最适合我:

grep -r -l 'searchtext' . | sort | uniq | xargs perl -e "s/matchtext/replacetext/" -pi

来源:http://www.praj.com.au/post/23691181208/grep-replace-text-string-in-files

另一种选择是在globstar中使用perl。

在你的.bashrc(或任何地方)中启用shop -s globstar允许** glob模式递归匹配所有子目录和文件。

因此使用perl -pXe 's/SEARCH/REPLACE/g' -i **将递归 用replace替换SEARCH。

- x标志告诉perl“禁用所有警告”-这意味着 它不会抱怨目录问题。

globstar还允许您执行sed -i 's/SEARCH/REPLACE/g' **/*之类的操作。如果你想在所有扩展名为.ext的子文件中用replace替换SEARCH。

现代防锈工具可以用来做这项工作。 例如,在所有(非忽略)文件中替换“oldstring”和“oldstring”分别为“newstring”和“newstring”,你可以:

使用fd和sd

fd -tf -x sd 'old([Ss]tring)' 'new$1' {}

使用羽绒

ned -R -p 'old([Ss]tring)' -r 'new$1' .

使用ruplacer

ruplacer --go 'old([Ss]tring)' 'new$1' .

忽略了文件

要包含被忽略的(通过.gitignore)和隐藏的文件,你必须指定它:

fd使用-IH, 使用—忽略—隐藏用于ruplacer。