我需要递归搜索目录中所有文件和子目录中的指定字符串,并将此字符串替换为另一个字符串。
我知道找到它的命令可能如下所示:
grep 'string_to_find' -r ./*
但是如何用另一个字符串替换string_to_find
的每个实例?
答案 0 :(得分:205)
另一种选择是使用find然后通过sed传递它。
find /path/to/files -type f -exec sed -i 's/oldstring/new string/g' {} \;
答案 1 :(得分:143)
我得到了答案。
grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'
答案 2 :(得分:31)
你甚至可以这样跟着......
示例强>
$webSocketBackend
这将搜索字符串' windows '在相对于当前目录的所有文件中,替换' windows '与' linux '对于每个文件中每次出现的字符串。
答案 3 :(得分:28)
这在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
答案 4 :(得分:4)
通常不使用grep,而是使用sed -i 's/string_to_find/another_string/g'
或perl -i.bak -pe 's/string_to_find/another_string/g'
。
答案 5 :(得分:4)
其他解决方案混合正则表达式语法。要使用perl / PCRE模式进行两者搜索和替换,并避免处理每个文件,这非常有效:
grep -rlZP 'match1' | xargs -0r perl -pi -e 's/match2/replace/g;'
其中match1
和match2
通常相同,但可以简化match1
以删除仅与替换相关的更多高级功能,例如捕获组。
翻译:grep递归并列出匹配文件,用nul分隔以保护文件名中与该PCRE模式匹配的任何特殊字符,然后将这些文件名传递给xargs,这些xargs期望一个空分隔列表,但是赢得了'如果没有收到任何名字,则执行任何操作,并获取perl重写每个文件,替换找到匹配项的行。
将I
选项添加到grep
以忽略二进制文件。
答案 6 :(得分:3)
在git仓库中使用find
和sed
时要非常小心!如果不排除二进制文件,则可能会出现以下错误:
error: bad index file sha1 signature
fatal: index file corrupt
要解决此错误,您需要通过将sed
替换为new_string
来还原old_string
。这将还原您替换的字符串,因此您将回到问题的开头。
搜索并替换字符串的正确方法是跳过find
并使用grep
来忽略二进制文件:
sed -ri -e "s/old_string/new_string/g" $(grep -Elr --binary-files=without-match "old_string" "/files_dir")
@hobs的积分
答案 7 :(得分:1)
这就是我要做的:
find /path/to/dir -type f -iname "*filename*" -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'
这将查找filename
下文件名中包含/path/to/dir
的所有文件,而不是找到的每个文件,用searchstring
搜索该行并替换old
与new
。
尽管您要省略查找文件名中带有filename
字符串的特定文件,但是比做简单的事情更容易:
find /path/to/dir -type f -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'
这与上述操作相同,但对/path/to/dir
下找到的所有文件。
答案 8 :(得分:0)
另一种选择是将perl与globstar一起使用。
在shopt -s globstar
(或任何地方)中启用.bashrc
允许**
glob模式以递归方式匹配所有子目录和文件。
因此递归地使用perl -pXe 's/SEARCH/REPLACE/g' -i **
将SEARCH
替换为REPLACE
。
-X
标志告诉perl“禁用所有警告” - 这意味着
它不会抱怨目录。
如果您希望在所有扩展名为sed -i 's/SEARCH/REPLACE/g' **/*.ext
的子文件中将SEARCH
替换为REPLACE
,则globstar还允许您执行.ext
之类的操作。