标题说的是:假设sed从STDIN1读取它的输出可以是一个文本文件吗?
为了清楚起见,我不是在谈论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)