如何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;'
其中match1
和match2
通常是相同的,但是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地用SEARCH
replaceSEARCH
。
-X
标志告诉perl“禁用所有的警告” – 这意味着它不会抱怨目录。
globstar也允许你在sed -i 's/SEARCH/REPLACE/g' **/*.ext
。ext之类的东西中replace所有子文件中带扩展名为.ext
SEARCH
和REPLACE
。
在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