如何grep和replace

我需要在目录中的所有文件和子目录中recursion地search指定的string,并将此stringreplace为另一个string。

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

grep 'string_to_find' -r ./* 

但是,我怎样才能将string_to_find每个实例string_to_find为另一个string呢?

另一个select是使用find,然后通过sed传递它。

 find /path/to/files -type f -exec sed -i 's/oldstring/new string/g' {} \; 

我得到了答案。

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

这在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 -rl 'windows' ./ | xargs sed -i 's/windows/linux/g' 

这将search相对于当前目录的所有文件中的string“ windows ”,并用“ linux ”replace每个文件中每个string的“ windows ”。

其他解决scheme混合使用正则expression式语法。 要使用perl / PCRE模式进行search和replace,并避免处理每个文件,这个工作得很好:

 grep -rlZP 'match1' | xargs -0r perl -pi -e 's/match2/replace/g;' 

其中match1match2通常是相同的,但是match1可以被简化以去除仅与replace相关的更高级特征,例如捕获组。

翻译:greprecursion地列出匹配的文件,由nul分隔,以保护文件名中的任何特殊字符,匹配这个PCRE模式,然后将这些文件名pipe到期望一个空分隔列表的xargs,但是如果没有名字被接收,并且得到perl来重写每个文件,代替find匹配的行。

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

通常不用grep,而用sed -i 's/string_to_find/another_string/g'perl -i.bak -pe 's/string_to_find/another_string/g'

另一个select是只使用perl和globstar。

.bashrc (或任何地方)启用shopt -s globstar ,可以使** glob模式recursion匹配所有的子目录和文件。

因此,使用perl -pXe 's/SEARCH/REPLACE/g' -i **将recursion地用SEARCHreplaceSEARCH

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

globstar也允许你在sed -i 's/SEARCH/REPLACE/g' **/*.ext 。ext之类的东西中replace所有子文件中带扩展名为.ext SEARCHREPLACE

在vi模式下查找和replace文件语法如下::%s / WORD-To-Find-HERE / Replace-Word-Here / g

OR:%s / FindMe / ReplaceME / g

例子

替代命令可以根据您的要求使用。

查找和replace

在linuxOS中:

 sed -i 's/textSerch/textReplace/g' namefile 

如果“sed”不工作尝试:

 perl -i -pe 's/textSerch/textReplace/g' namefile