【问题标题】:Delete second-to-last line of file using sed使用 sed 删除文件的倒数第二行
【发布时间】:2017-02-17 00:37:54
【问题描述】:

我有一个 file.txt,我必须删除文件的倒数第二行。 以下三个 sed 命令能够打印倒数第二行。但我需要删除该行。有什么帮助吗??

sed -e '$!{h;d;}' -e x file.txt

sed -n 'x;$p' file.txt

sed 'x;$!d' file.txt

$ cat file.txt
苹果

香蕉
胡萝卜
浆果

我们可以删除文件的倒数第二行吗:
一个。不基于任何字符串/模式。
湾。基于模式 - 如果倒数第二行包含“胡萝卜”

【问题讨论】:

  • sed 以外的选项是否可行?例如,您会考虑使用headtail 之类的东西吗?
  • #1 将是 head -n -2 file.txt; tail -n 1 file.txt

标签: sed delete-row


【解决方案1】:

这可能对你有用(GNU sed):

sed -i 'N;$!P;D' file

这会在模式空间中设置一个包含两行的窗口,然后在第二行不是最后一行时打印其中的第一行。总是打印最后一行,因为无法获取下一行。

根据模式删除文件的倒数第二行可以通过以下方式实现:

sed -i 'N;$!P;${/pattern.*\n/!P};D'

【讨论】:

  • Potong,刚测试过,它打印的输出没有倒数第二行,但实际文件中没有删除该行。
  • @Arun 你必须添加-i 选项来更新文件内联。见编辑。
  • 波东,它有效。你能解释一下 'N;$!P;D' 部分吗?
  • @Arun 将光标悬停在sed 标签上,您将在那里找到更多信息。 Sed 是一个行编辑器,因此它一次将一行读入一个称为模式空间 (PS) 的寄存器中(首先删除任何换行符)。 N 命令将下一行(由换行符分隔)附加到 PS。 $ 是文件最后一行的地址。 ! 否定前面的地址或模式,所以$! 表示不是最后一行。 P 从 PS 的开头打印到并包括任何换行符。 D 删除 P 匹配的内容,然后将控制权转移到第一个命令,除非在开始新循环时 PS 为空。
  • 感谢您的解释。如果 D 用于删除,你能说出在倒数第二行(上例)中用另一个字符串替换模式是什么吗?
【解决方案2】:

我知道这是一个老问题,但由于我没有看到我使用什么,我会添加它以防万一。

sedtac 组合起来非常简单:

mv file.txt file.txt.bak
tac file.txt.bak | sed '2d' | tac > file.txt

这将删除文件的倒数第二行。这不是一个“纯粹的”sed 解决方案,它需要一个中间文件,但我经常使用它,因为恕我直言,它更容易理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 2016-11-24
    • 2015-12-13
    • 1970-01-01
    • 2022-12-05
    • 2016-11-06
    • 2018-05-23
    相关资源
    最近更新 更多