rez*_*ter 223
另一个选择是使用find然后通过sed传递它.
find /path/to/files -type f -exec sed -i 's/oldstring/new string/g' {} \;
Run Code Online (Sandbox Code Playgroud)
bil*_*ian 158
我得到了答案.
grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'
Run Code Online (Sandbox Code Playgroud)
Dul*_*sta 36
你甚至可以这样跟着..
例
grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'
Run Code Online (Sandbox Code Playgroud)
这将在相对于当前目录的所有文件中搜索字符串' windows ',并在每个文件中每次出现字符串时将' windows ' 替换为' linux '.
Mar*_*hli 28
这在OS X上最适合我:
grep -r -l 'searchtext' . | sort | uniq | xargs perl -e "s/matchtext/replacetext/" -pi
Run Code Online (Sandbox Code Playgroud)
资料来源:http://www.praj.com.au/post/23691181208/grep-replace-text-string-in-files
通常不使用grep,而是使用sed -i 's/string_to_find/another_string/g'or perl -i.bak -pe 's/string_to_find/another_string/g'。
其他解决方案混合了正则表达式语法。使用Perl / PCRE模式为两种搜索和替换,避免加工的每一个文件,这个作品非常好:
grep -rlZP 'match1' | xargs -0r perl -pi -e 's/match2/replace/g;'
Run Code Online (Sandbox Code Playgroud)
其中match1和match2通常相同,但match1可以简化以删除仅与替换有关的更高级功能,例如捕获组。
翻译:grep递归并列出匹配文件,以nul分隔以保护文件名中与该PCRE模式匹配的任何特殊字符,然后将这些文件名通过管道传递给xargs,该文件期望以空分隔的列表,但如果没有则不执行任何操作接收到名称,并让perl重写每个文件,替换找到匹配项的行。
还添加了忽略二进制文件的I选项grep。
在 git 存储库中使用find和使用时要非常小心!sed如果不排除二进制文件,可能会出现以下错误:
error: bad index file sha1 signature
fatal: index file corrupt
Run Code Online (Sandbox Code Playgroud)
要解决此错误,您需要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")
Run Code Online (Sandbox Code Playgroud)
@hobs 的学分
| 归档时间: |
|
| 查看次数: |
298774 次 |
| 最近记录: |