我需要在一个目录中的所有文件和子目录中递归地搜索指定的字符串,并用另一个字符串替换此字符串。
我知道查找它的命令可能是这样的:
grep 'string_to_find' -r ./*
但是如何用另一个字符串替换string_to_find的每个实例呢?
我需要在一个目录中的所有文件和子目录中递归地搜索指定的字符串,并用另一个字符串替换此字符串。
我知道查找它的命令可能是这样的:
grep 'string_to_find' -r ./*
但是如何用另一个字符串替换string_to_find的每个实例呢?
当前回答
另一种选择是在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。
其他回答
另一种选择是在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。
这在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
通常不使用grep,而是使用sed -i 's/string_to_find/another_string/g'或perl -i.bak -pe 's/string_to_find/another_string/g'。
在git repo中使用find和sed时要非常小心!如果你不排除二进制文件,你会得到这样的错误:
error: bad index file sha1 signature
fatal: index file corrupt
要解决这个错误,您需要通过用old_string替换new_string来恢复sed。这将恢复替换的字符串,因此您将回到问题的起点。
搜索字符串并替换它的正确方法是跳过find,而是使用grep来忽略二进制文件:
sed -ri -e "s/old_string/new_string/g" $(grep -Elr --binary-files=without-match "old_string" "/files_dir")
感谢@hobs
我得到了答案。
grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'