干跑的sed命令

dme*_*meu 45 sed dry

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

所以我有这个命令:

find ./ -type f | xargs sed -i 's/string1/string2/g'
Run Code Online (Sandbox Code Playgroud)

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

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

Sie*_*geX 35

删除-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)
Run Code Online (Sandbox Code Playgroud)

  • 发现有什么问题.-type f -print0 | xargs -0 sed ...`?这样做的优点是对于许多文件执行一次sed而不是每个文件执行一次.在仅限shell的版本中有一些开销 - 不是一个令人发指的开销,而是一些. (3认同)

Mur*_*mel 17

我更喜欢使用p选项:

find ./ -type f | xargs sed 's/string1/string2/gp'
Run Code Online (Sandbox Code Playgroud)

可以与--quiet参数结合使用,以减少详细输出:

find ./ -type f | xargs sed --quiet 's/string1/string2/gp'
Run Code Online (Sandbox Code Playgroud)

来自man sed:

电话号码:

打印当前模式空间.

- 安静:

抑制图案空间的自动打印

  • 我喜欢这个。只是一个警告:如果你在一个 git repo 中,你可能会在你的 `.git` 文件夹中匹配字符串,这可能不是你想要做的。为了避免这种情况,从比 `find ./ -type f` 更聪明的东西开始。例如:`ag -l | xargs sed...`(你可能需要安装 ag) (2认同)

har*_*dsv 8

我知道这是一个非常老的线程,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
Run Code Online (Sandbox Code Playgroud)

根据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
Run Code Online (Sandbox Code Playgroud)

您还可以捕获变量中的输出以避免两次执行:

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
Run Code Online (Sandbox Code Playgroud)