Linux vim/vi/sed:在文件末尾的一定数量的行上执行操作
正如我们可以在vim中删除(或替换,或yank等)文件开头的第4到第6行一样:Linux vim/vi/sed:在文件末尾的一定数量的行上执行操作,linux,bash,vim,sed,awk,Linux,Bash,Vim,Sed,Awk,正如我们可以在vim中删除(或替换,或yank等)文件开头的第4到第6行一样: :4,6d 我想删除(或替换,或猛拉等)文件末尾的最后4行到第6行。这意味着,如果文件有15行,我会: :10,12d 但是,当人们不知道文件中有多少行时,就不能这样做——我将在一批文件中使用它。如何在vim和sed中执行此操作 事实上,我确实查看了,但没有发现它有用。好吧,使用vim您可以尝试以下方法——无论如何,这是非常直观的: :$-4,$-5d 现在,使用sed我找不到确切的方法,但是如果您可以使用s
:4,6d
我想删除(或替换,或猛拉等)文件末尾的最后4行到第6行。这意味着,如果文件有15行,我会:
:10,12d
但是,当人们不知道文件中有多少行时,就不能这样做——我将在一批文件中使用它。如何在vim和sed中执行此操作
事实上,我确实查看了,但没有发现它有用。好吧,使用
vim
您可以尝试以下方法——无论如何,这是非常直观的:
:$-4,$-5d
现在,使用sed
我找不到确切的方法,但是如果您可以使用sed
以外的其他方法,这里有一个带有头部
和尾部
的解决方案:
head -n -4 file.txt && tail -2 file.txt
在Vim中,您可以从代表最后一行的
$
中减去行号,例如,这将适用于最后3行:
:$-2,$substitute/...
在sed中,这并不容易,因为它在字符流上工作,不能简单地返回。您必须在保留空间中存储一些最后看到的行,并在流的末尾在保留空间中工作。 以下是一些来自:
从文件末尾的最后4行到第6行:用于反转文件
tac filename | sed 4,6d | tac
这可能适用于您(GNU-sed):
其工作原理是在模式空间(PS)中创建一个包含6行的移动窗口,然后在遇到最后一行时删除前三行
是循环标签:a
删除文件末尾PS的前三行并退出${s/([^\n]*\n){3}//;q}
将换行,然后将下一行添加到PSN
“如果不是从7,$!ba
到7
(文件末尾)的行,即从$
到1
,则循环回开始,即标签6
:a
对于行范围P;D
到7
(文件结束)打印到PS中的第一个换行,然后删除到并包括第一个换行,并开始新的循环$
1
到6
行追加到PS中。从第7行到末尾,在末尾添加一行,打印第一行,然后删除
或者:
sed -e ':a' -e '$s/\([^\n]*\n\)\{3\}//' -e '$q' -e 'N' -e '7,$!ba' -e 'P' -e 'D' file
您可以在awk中使用两个过程,第一个过程用于计算行数,第二个过程用于打印或删除您喜欢的任何行,例如
awk 'NR==FNR{numLines++;next} {fromEnd = numLines - FNR} fromEnd > 6 || fromEnd < 4' file file
awk 'NR==FNR{numLines++;next} {fromEnd = numLines - FNR} fromEnd < 6 && fromEnd > 4' file file
awk'NR==FNR{numLines++;next}{fromEnd=numLines-FNR}fromEnd>6 | | fromEnd<4'文件
awk'NR==FNR{numLines++;next}{fromEnd=numLines-FNR}fromEnd<6&&fromEnd>4'文件
谢谢。那么,我如何使用head和tail进行替换,就像我在sed和vim中通常做的那样?tail-6 file.txt | head-2 | sed-e'…'
注意,sed和vim s命令的语法有点不同。您最好使用>
保存文件,然后使用vim打开它。
sed -e ':a' -e '$s/\([^\n]*\n\)\{3\}//' -e '$q' -e 'N' -e '7,$!ba' -e 'P' -e 'D' file
awk 'NR==FNR{numLines++;next} {fromEnd = numLines - FNR} fromEnd > 6 || fromEnd < 4' file file
awk 'NR==FNR{numLines++;next} {fromEnd = numLines - FNR} fromEnd < 6 && fromEnd > 4' file file