Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux vim/vi/sed:在文件末尾的一定数量的行上执行操作_Linux_Bash_Vim_Sed_Awk - Fatal编程技术网

Linux vim/vi/sed:在文件末尾的一定数量的行上执行操作

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

正如我们可以在vim中删除(或替换,或yank等)文件开头的第4到第6行一样:

: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
    是循环标签
  • ${s/([^\n]*\n){3}//;q}
    删除文件末尾PS的前三行并退出
  • N
    将换行,然后将下一行添加到PS
  • 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