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

Phi*_*pos 8 sed posix

我刚刚发现如果我执行

echo foo|sed 's/x/u/w/tmp/bar'
Run Code Online (Sandbox Code Playgroud)

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

echo foo|sed 'd;w/tmp/bar'
Run Code Online (Sandbox Code Playgroud)

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

事实上,GNUsed手册也承认:

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

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

sed您知道这种情况下其他实现的行为吗?

或者我误解了这里的标准?

Kus*_*nda 10

sed关于命令处理w和命令w标志的 GNU 实现严格遵循 POSIX 规范s。以下内容来自该实用程序的 POSIX 规范的扩展描述部分sed

每个wfile应在处理开始之前创建。

w“wfile”是由命令或命令w的标志写入的文件s

在 FreeBSD、macOS、OpenBSD 和 NetBSD 上发现的 BSD 实现sed有一个非标准-a选项,可以延迟“wfile”的创建或截断,直到将其写入:

-a
默认情况下,作为函数参数列出的文件w是在任何处理开始之前创建(或截断)的。该-a选项会导致sed延迟打开每个文件,直到将包含相关函数的命令w应用于输入行。