我无法确定是否以及如何使用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)
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:
电话号码:
打印当前模式空间.
- 安静:
抑制图案空间的自动打印
我知道这是一个非常老的线程,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)
| 归档时间: |
|
| 查看次数: |
20244 次 |
| 最近记录: |