使用`sed`打印和删除文件的第一行

And*_*ong 12 sed files

我可以使用打印文件的第一行

sed -n 1p file.txt
Run Code Online (Sandbox Code Playgroud)

我可以使用删除文件的第一行

sed -i 1d file.txt
Run Code Online (Sandbox Code Playgroud)

有没有办法打印和删除sed?有点像 FIFOpop()或 Perl 的shift.

Gil*_*il' 11

您可以使用该命令w将一些行写入不同的输出文件。在 Linux 和许多其他 unix 变体上,/dev/stdout是程序的标准输出,这不是 sed 使用-i选项写入的地方。如果您的系统没有/dev/stdout或类似的变体/dev/fd/1,您可以写入命名管道。

sed -i -e '1 w /dev/stdout' -e '1d' file.txt
Run Code Online (Sandbox Code Playgroud)


dha*_*ian 6

这个答案是吉尔斯答案的延伸。

需要将地址写入两次并不是很“DRY”,虽然对于仅删除第一行的示例来说它工作得很好,但如果您对要从文件中“提取”的行有更复杂的搜索模式,则该方法会变得更成问题。您可以使用花括号对同一地址执行w和命令,而不是两次写入地址。d使用原来的例子,看起来像这样:

sed -i -e '1{w /dev/stdout' -e 'd}' file.txt
Run Code Online (Sandbox Code Playgroud)

或者更一般地说:

sed -i -e '/some long regex/{w /dev/stdout' -e 'd}' file.txt
Run Code Online (Sandbox Code Playgroud)

  • `-e` 的文档说:“'-e SCRIPT' 将 SCRIPT 中的命令添加到处理输入时要运行的命令集中。” 因此,它们不是按顺序执行而是单独执行的独立命令,而是在同一上下文中一起运行,就像它们位于用“-f”指定的脚本文件中的不同行上一样,或者用分号分隔。这种模式与像“w”和“a”这样的命令一起使用,除了结束表达式并开始一个新的表达式之外,在单行中不能以任何其他方式真正终止这些命令。 (2认同)