标题说的是什么:假设sed
从STDIN
1读取,它的输出可以是一个文本文件吗?
需要明确的是,我并不是在谈论sed
通过 shell 运算符(如 )将 的输出保存到文本文件>
,>>
或使用诸如tee
等工具。
这里的问题是是否sed
独自的可以以文本文件的形式产生输出,如果可以,在什么情况下?
1:这只是为了排除使用支持它的实现对文本文件进行任何就地编辑。
答案1
是的,使用w
命令,或者命令w
的标志s
,两者都是由 POSIX 指定。
例如,与
sed -n 'w output.txt'
任何输入到sed
的标准输入中的内容都将被写入output.txt
,而不会输出到sed
的标准输出(感谢该-n
选项)。这可以与其他命令结合使用,在写出模式空间之前对其进行操作。
一些警告和建议:
如果文件名以空格开头,请使用前缀./
:
sed -n 'w ./ output with blanks.txt'
如果文件名包含换行符,POSIXly,您可以使用反斜杠对其进行转义,尽管它不适用于所有sed
实现(特别是不适用于 GNUsed
或 busybox sed
):
sed -n 'w ./output\
with\
newline.txt'
如果它包含反斜杠字符,在某些实现中(上面的 POSIX 支持文件名中的换行符),您需要使用反斜杠对其进行转义:
sed -n 'w file\\with\\backslash.txt' # POSIX
sed -n 'w file\with\backslash.txt' # GNU
另请注意,即使输入为空或命令w
从未运行,输出文件也会被创建(或截断),如下所示:
sed 'd;w file'
或者
seq 20 | sed '/21/ w file'
您可能想使用awk
代替来避免此类问题
FILE=arbitrary-file-name awk '/100/ {print > ENVIRON["FILE"]}'