我刚刚发现如果我执行
echo foo|sed 's/x/u/w/tmp/bar'
使用 GNU 时sed
,会创建一个空文件/tmp/bar
,这不是有意的,因为该w
标志不适用。更糟糕,
echo foo|sed 'd;w/tmp/bar'
还创建了那个空文件!呜呜。
确实,GNUsed
手册承认:
该文件将在读取第一个输入行之前创建(或截断)
我想,如果您不必测试每个文件句柄是否打开,那么实现起来会更容易,但是 的 POSIX 定义并sed
没有说可以在不执行命令的情况下触摸该文件。--posix
GNU 的切换没有sed
帮助。
sed
您知道这种情况下其他实现的行为吗?
或者我误解了这里的标准?
答案1
sed
关于命令处理w
和命令w
标志的GNU 实现严格遵循 POSIX 规范s
。以下内容来自sed
实用程序的 POSIX 规范的扩展描述部分:
每个工作文件应在处理开始之前创建。
w
“wfile”是由命令或命令w
的标志写入的文件s
。
在 FreeBSD、macOS、OpenBSD 和 NetBSD 上发现的BSD 实现sed
有一个非标准-a
选项,可以延迟“wfile”的创建或截断,直到将其写入:
-a
w
默认情况下, 作为函数参数列出的文件是在任何处理开始之前创建(或截断)的。该-a
选项会导致sed
延迟打开每个文件,直到将包含相关函数的命令w
应用于输入行。