使用sed删除文件的倒数第二行
我有一个file.txt文件,我必须删除该文件倒数第二行。 下面三个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):
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