使用sed删除文件的倒数第二行

使用sed删除文件的倒数第二行,sed,delete-row,Sed,Delete Row,我有一个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 苹果 梨 香蕉 胡萝卜 浆果 我们是否可以删除文件的倒数第二行: A.不基于任何字符串/模式。 B基于模式-如果倒数第二行包含“carrot”这可能适合您(GNU-sed):

我有一个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
苹果

香蕉
胡萝卜
浆果

我们是否可以删除文件的倒数第二行:
A.不基于任何字符串/模式。
B基于模式-如果倒数第二行包含“carrot”

这可能适合您(GNU-sed):

这将在图案空间中设置一个包含两行的窗口,然后在第二行不是最后一行时打印第一行。始终打印最后一行,因为无法提取下一行

基于模式删除文件的第二行到最后一行可以通过以下方式实现:

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

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

sed
tac
相结合,可以很容易做到:

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

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

除了
sed
之外,还有其他选项吗?例如,你会考虑使用诸如<代码>头<代码>还是<代码>尾<代码>?1将是<代码>头-N 2文件。tail-n 1 file.txt,刚刚测试过,它打印输出时没有倒数第二行,但该行在实际文件中没有被删除。@Arun您必须添加
-i
选项以内联更新文件。请参见编辑。波通,它起作用了。你能解释一下“N;$”吗!PD'part?@Arun将光标悬停在
sed
标记上,您将在那里找到更多信息。Sed是一个行编辑器,所以它一次读取一行到一个称为模式空间(PS)的寄存器中(任何换行都是先删除的)
N
命令将下一行(以换行符分隔)附加到PS。
$
是文件最后一行的地址<代码>否定先前的地址或模式,因此
$表示不是最后一行
P
从PS的开头打印到并包括任何换行符
D
删除
P
匹配的内容,然后将控制权转移到第一个命令,除非在新循环开始时PS为空。感谢您的解释。如果D是用于删除的,您能否在下一行的最后一行(上面的示例)中指出用另一个字符串替换模式的方法?
mv file.txt file.txt.bak
tac file.txt.bak | sed '2d' | tac > file.txt