sed命令显示参数太长

sed命令显示参数太长

我想将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/' {}" \;

相关内容