我想将str1
当前目录中文件中的所有字符串替换为str2
.我用
sed -i s/str1/str2/g `grep str1 -rl ./`
命令或
sed -i s/str1/str2/g `grep str1 -rl --include="*.*" ./`
出现参数太长的错误。有人能告诉我为什么吗?我用谷歌搜索了这个命令。我也看了sed
和的介绍grep
,感觉没有错误。
答案1
grep str1 -rl .
生成包含str1
.这个清单太长了。这不是sed
或的问题grep
,而是系统为参数提供的空间量的问题。 A讨论可以在同一个论坛上找到“参数列表太长”错误的信息。
解决这个问题的一种方法是xargs
:
grep -rl str1 . | xargs sed -i 's/str1/str2/'
xargs
获取其输入并sed
使用整个输入的适当大小的部分重复调用。
因为我们不知道是否有奇怪的文件名包含空格、“;”、“|”等特殊字符等等,更好的方法可能是
find . -type f -exec sed -i 's/str1/str2/' {} \;
find
遍历所有常规文件,如果文件包含则执行替换字符串1。调用grep
以检查文件是否包含字符串1很浪费。
请注意,这些解决方案与您原来的问题一样,假设所有文件都可以使用 进行处理sed
,即它们是文本文件。如果您不确定,此代码仅sed
在确认该文件是文本文件后运行:
find . -type f -exec sh -c "file {} | grep -q text && sed -i 's/str1/str2/' {}" \;