我无法确定是否以及如何使用sed进行干运行。
所以我有这个命令:
find ./ -type f | xargs sed -i 's/string1/string2/g'
但在我真正替换所有文件之前,我想检查一下它会替代什么。复制整个目录结构以进行检查是不可取的!
感谢任何反馈(消极或积极:))
答案 0 :(得分:30)
删除-i
并将其传递给less
,以便对结果进行分页。或者,您可以删除-i
并附加> dryrun.out
我应该注意到,你的这个剧本会因为名字中包含空格的文件或其他邪恶的角色(如换行符或诸如此类的东西)而悲惨地失败。更好的方法是:
while IFS= read -r -d $'\0' file; do
sed -i 's/string1/string2/g' "$file"
done < <(find ./ -type f -print0)
答案 1 :(得分:14)
我更喜欢使用p-option:
find ./ -type f | xargs sed 's/string1/string2/gp'
可以与--quiet参数组合以获得更简洁的输出:
find ./ -type f | xargs sed --quiet 's/string1/string2/gp'
来自man sed
:
号码:
打印当前模式空间。
- 安静:
禁止自动打印图案空间
答案 2 :(得分:6)
我知道这是一个非常古老的线程,OP并不真的需要这个答案,但我自己来这里寻找一个干运行模式,所以考虑为将来来这里的人添加以下建议。我想要做的是避免踩踏备份文件,除非有真正改变的东西。如果使用带有备份后缀的-i
选项盲目地运行sed,则现有的备份文件会被覆盖,即使没有替换也是如此。
我最终做的方法是将sed输出管道传输到diff并查看是否有任何更改,然后使用就地更新选项重新运行sed,如下所示:
if ! sed -e 's/string1/string2/g' $fpath | diff -q $fpath - > /dev/null 2>&1; then
sed -i.bak -e 's/string1/string2/g' $fpath
fi
根据OP的问题,如果要求只是看看会发生什么变化,那么你可以再次使用一些信息性消息来代替运行节奏的sed:
if ! sed -e 's/string1/string2/g' $fpath | diff -q $fpath - > /dev/null 2>&1; then
echo "File $fpath will change with the below diff:"
sed -e 's/string1/string2/g' $fpath | diff $fpath -
fi
您还可以捕获变量中的输出以避免两次执行:
diff=$(sed -e 's/string1/string2/g' $fpath | diff $fpath -)
if [[ $? -ne 0 ]]; then
echo "File $fpath will change with the below diff:"
echo "$diff"
fi