如何grep和替换

时间:2013-03-14 06:39:15

标签: linux grep replace

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

我知道找到它的命令可能如下所示:

grep 'string_to_find' -r ./*

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

9 个答案:

答案 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;'

其中match1match2通常相同,但可以简化match1以删除仅与替换相关的更多高级功能,例如捕获组。

翻译:grep递归并列出匹配文件,用nul分隔以保护文件名中与该PCRE模式匹配的任何特殊字符,然后将这些文件名传递给xargs,这些xargs期望一个空分隔列表,但是赢得了'如果没有收到任何名字,则执行任何操作,并获取perl重写每个文件,替换找到匹配项的行。

I选项添加到grep以忽略二进制文件。

答案 6 :(得分:3)

在git仓库中使用findsed时要非常小心!如果不排除二进制文件,则可能会出现以下错误:

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搜索该行并替换oldnew

尽管您要省略查找文件名中带有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之类的操作。