如果 w 命令或标志从未执行过,是否允许 sed 创建文件?

如果 w 命令或标志从未执行过,是否允许 sed 创建文件?

我刚刚发现如果我执行

echo foo|sed 's/x/u/w/tmp/bar'

使用 GNU 时sed,会创建一个空文件/tmp/bar,这不是有意的,因为该w标志不适用。更糟糕,

echo foo|sed 'd;w/tmp/bar'

还创建了那个空文件!呜呜。

确实,GNUsed手册承认:

该文件将在读取第一个输入行之前创建(或截断)

我想,如果您不必测试每个文件句柄是否打开,那么实现起来会更容易,但是 的 POSIX 定义并sed没有说可以在不执行命令的情况下触摸该文件。--posixGNU 的切换没有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应用于输入行。

相关内容