干跑的sed命令

时间:2010-12-22 20:55:11

标签: sed dry

我无法确定是否以及如何使用sed进行干运行。

所以我有这个命令:

find ./ -type f | xargs sed -i 's/string1/string2/g'

但在我真正替换所有文件之前,我想检查一下它会替代什么。复制整个目录结构以进行检查是不可取的!

感谢任何反馈(消极或积极:))

3 个答案:

答案 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