我需要在目录内的所有文件和子目录中递归搜索指定的字符串,并将此字符串替换为另一个字符串。如何grep和替换
我知道的命令找出它可能是这样的:
grep 'string_to_find' -r ./*
但我怎么能代替的string_to_find
每个实例与另一个字符串?
我需要在目录内的所有文件和子目录中递归搜索指定的字符串,并将此字符串替换为另一个字符串。如何grep和替换
我知道的命令找出它可能是这样的:
grep 'string_to_find' -r ./*
但我怎么能代替的string_to_find
每个实例与另一个字符串?
通常不是用grep,而是用sed -i 's/string_to_find/another_string/g'
或perl -i.bak -pe 's/string_to_find/another_string/g'
。
我得到了答案。
grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'
另一个选择是使用find然后通过sed传递它。
find /path/to/files -type f -exec sed -i 's/oldstring/new string/g' {} \;
在OS X 10.10终端上,需要一个到参数'-i'的正确扩展字符串。例如,'find/path/to/files -type f -exec sed -i'“”s/oldstring/new string/g“{} \;'无论如何,提供空字符串仍然会创建一个备份文件, ... – Eonil 2015-06-25 02:41:06
为什么我会得到“sed:RE错误:非法字节序列”。是的,我为OS X添加了“-i”“',否则它会起作用。 – taco 2016-06-16 19:51:01
我在macOS 10.12上有非法字节序列问题,并且这个问题/答案解决了我的问题:http://stackoverflow.com/questions/19242275/re-error-illegal-byte-sequence-on-mac-os-x 。 – abeboparebop 2017-04-11 08:12:14
这个最适合我的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
这是完美的!也适用于ag:'ag“search”-l -r。 |排序| uniq | xargs perl -e's/search/replace'-pi' – 2016-03-04 11:24:59
'sort -u'可以代替'sort | uniq' – 2016-03-05 00:41:14
@sebastiankeller你的Perl命令缺少最后一个斜杠,这是一个语法错误。 – tripleee 2016-06-11 08:12:13
另一种选择是只用perl与globstar。
在您的.bashrc
(或任何地方)启用shopt -s globstar
允许**
glob模式递归匹配所有子目录和文件。
因此使用perl -pXe 's/SEARCH/REPLACE/g' -i **
将递归地 替换SEARCH
与REPLACE
。
-X
标志告诉perl“禁用所有警告” - 这意味着它不会抱怨目录。
的globstar还允许你做这样的事情sed -i 's/SEARCH/REPLACE/g' **/*.ext
如果你想与REPLACE
在所有子文件扩展名为.ext
更换SEARCH
。
*“另一种选择是使用perl和globstar ...”* - 不在Posixy机器上,如Solaris。这就是为什么我特意寻找'grep'和'sed'。 – jww 2017-10-25 00:20:31
你甚至可以遵循这样的..
例
grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'
这将为字符串中的所有文件的相对“窗口”搜索到当前目录和替换“窗口'与'linux',每个文件中每个字符串的出现次数。
其他解决方案混合使用正则表达式语法。使用Perl/PCRE模式为都搜索和替换,避免加工的每一个文件,这个工作得很好:
grep -rlZP 'match1' | xargs -0r perl -pi -e 's/match2/replace/g;'
其中match1
和match2
通常是相同的,但match1
可以简化去除更多的先进功能,只与替代有关,例如捕获组。
翻译︰grep递归和列出匹配的文件,由nul分隔以保护文件名中的任何特殊字符,匹配此PCRE模式,然后管这些文件名xargs期望一个空分隔的列表,但不会如果没有收到任何名字,请做任何事情,然后让perl重写每个文件,替换找到匹配的行。
将I
选项添加到grep
以忽略二进制文件。
找到&替换文件的vi模式 的语法如下: :%s/WORD找到的-HERE /替换词,这里/ G
OR :%s/FindMe/ReplaceME /克
实例
的替代命令可用于按您的要求。
我不相信grep可以做到这一点(我可能是错的)。更简单的方法是使用sed或perl来替换 – 2013-03-14 06:41:40
尝试使用'sed -i's /.*子字符串*/replace /'' – 2013-03-14 06:42:09
@Eddy_Em这将用replace代替整行。您需要使用分组来捕获子字符串前后的部分行,然后将其放入替换行中。 'sed -i's/\(。* \)substring \(。* \)/ \ 1replace \ 2 /'' – JStrahl 2014-08-05 07:50:37