Sed

如果從未執行 w 命令或標誌,是否允許 sed 創建文件?

  • August 16, 2022

我剛剛發現如果我執行

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

使用 GNU會創建sed一個空文件/tmp/bar,這不是預期的,因為該w標誌不適用。更糟,

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

還會創建那個空文件!呸呸呸。

事實上,GNU 的sed手冊承認:

該文件將在讀取第一行輸入之前創建(或截斷)

我想,如果您不必測試每個文件句柄是否打開,那麼實現起來會更容易,但是 POSIX 的定義sed並沒有說可以在不執行命令的情況下觸摸文件。--posixGNU的切換sed沒有幫助。

您知道sed在這種情況下其他實現的行為嗎?

還是我誤解了這裡的標準?

關於命令的處理和命令的標誌,GNU 實現sed遵循 POSIX 規範。以下來自實用程序的 POSIX 規範的擴展描述部分w``w``ssed

每個wfile都應在處理開始之前創建。

w“wfile”是由命令或命令w標誌寫入的文件s

在 FreeBSD、macOS、OpenBSD 和 NetBSD 上找到的 BSD 實現sed有一個非標準-a選項,它會延遲“wfile”的創建或截斷,直到它被寫入:

-a

預設情況下,作為w函式參數列出的文件在任何處理開始之前創建(或截斷)。該-a選項導致sed延遲打開每個文件,直到包含相關w函式的命令應用於輸入行。

引用自:https://unix.stackexchange.com/questions/713710