只要输入来自 STDIN,sed 就可以自己生成文本文件形式的输出吗?

don*_*sti 2 sed

标题说的是:假设sedSTDIN1读取它的输出可以是一个文本文件吗?
为了清楚起见,我不是在谈论sed通过 shell 操作符(如>>>或使用诸如tee
的工具将的输出保存到文本文件。这里的问题是是否可以sed 单独生成文本文件形式的输出,如果那么,在什么情况下?


1:这只是为了排除具有支持它的实现的文本文件的任何就地编辑。

Ste*_*itt 10

是的,使用w命令或命令的w标志s,两者都由 POSIX 指定

例如,与

sed -n 'w output.txt'
Run Code Online (Sandbox Code Playgroud)

任何输入sed的标准输入的内容都将写入output.txt,而没有输出到sed的标准输出(感谢-n选项)。这可以与其他命令结合使用,以在写出模式空间之前对其进行操作。

一些警告和建议的注意事项:

如果文件名以空白开头,请使用./前缀:

sed -n 'w ./ output with blanks.txt'
Run Code Online (Sandbox Code Playgroud)

如果文件名包含换行符,POSIXly,您可以使用反斜杠将它们转义,尽管它不适用于所有sed实现(特别是不适用于 GNUsed或 busybox sed):

sed -n 'w ./output\
with\
newline.txt'
Run Code Online (Sandbox Code Playgroud)

如果它包含反斜杠字符,在某些实现中(上面的 POSIX 支持文件名中的换行符),您需要使用反斜杠将它们转义:

sed -n 'w file\\with\\backslash.txt' # POSIX
sed -n 'w file\with\backslash.txt'   # GNU
Run Code Online (Sandbox Code Playgroud)

另请注意,即使输入为空或w命令从未像以下那样运行,也会创建(或截断)输出文件:

sed 'd;w file'
Run Code Online (Sandbox Code Playgroud)

或者

seq 20 | sed '/21/ w file'
Run Code Online (Sandbox Code Playgroud)

您可能想awk改用以避免此类问题

FILE=arbitrary-file-name awk '/100/ {print > ENVIRON["FILE"]}'
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅 GNU `sed` 的 `W` 命令。 (2认同)