为何find+grep+sed命令仅显示目标文件,未执行sed替换操作?
问题分析与修正
你的命令出错的核心原因是:管道后的sed是在处理grep -L输出的文件名文本,而不是修改文件内部的内容,所以只会打印修改后的文件名,根本没对目标文件执行替换操作。
正确的实现方式
方式一:用find直接结合条件判断执行sed
find . -type f -name "Myfile.txt" -exec sh -c 'grep -q "my-wished-string" "$1" || sed -i "s/similar-to-my-wished-string/my-wished-string/" "$1"' _ {} \;
grep -q:静默检查文件是否包含目标字符串,找到则返回0,没找到返回非0||:只有当grep没找到字符串时,才执行后面的sed命令sed -i:原地修改文件内容(Linux环境下可用;如果是macOS,需要写成sed -i '' "s/...")
方式二:先筛选文件再用xargs批量处理
find . -type f -name "Myfile.txt" -exec grep -L "my-wished-string" {} + | xargs sed -i "s/similar-to-my-wished-string/my-wished-string/"
grep -L:输出所有不包含目标字符串的文件名xargs:把这些文件名作为参数传给sed,让sed直接修改文件内容- 同样注意:macOS环境下
sed -i需要加空参数-i ''
内容的提问来源于stack exchange,提问作者mafra
相关产品推荐
相关产品推荐

