sed:删除文件除最后 X 行之外的所有内容

sed:删除文件除最后 X 行之外的所有内容

这可以用其他工具来完成,但我感兴趣的是知道如何使用 删除文件除最后 X 行之外的所有内容sed

答案1

基本上,您正在模拟 tail。此示例中的 X = 20。以下示例将删除除最后 20 行之外的所有内容:

sed -i -e :a -e '$q;N;21,$D;ba' filename

解释:

  • -e :a 创建一个名为 a 的标签
  • 下一个-e:
    • $q - 如果这是最后一行,则退出并打印模式空间
    • N——下一行
    • 21,$D - 如果行号 >= 21(21,$ = 第 21 行到 $ 即文件末尾),则执行“D”命令
    • ba-分支标记“a”,即脚本的开头。

答案2

sed在处理这类任务时相当复杂。tailgrep或者awk会使这变得容易得多,应该改用。 话虽如此,可能的。

以下解决方案改编自sed 和多行搜索和替换

sed -ni '
    # if the first line copy the pattern to the hold buffer
    1h
    # if not the first line then append the pattern to the hold buffer
    1!H
    # if the last line then ...
    ${
            # copy from the hold to the pattern buffer
            g
            # delete current line if it is followed by at least X more lines
            # replace X-1 with the proper value
            s/.*\n\(\(.*\n\)\{X-1\}\)/\1/
            # print
            p
    }
' filename

如果没有注释,它就是一行漂亮的代码。如果你想删除除最后十行以外的所有内容,请使用以下命令:

sed -ni '1h;1!H;${;g;s/.*\n\(\(.*\n\)\{9\}\)/\1/;p;}' filename

答案3

根据脚本sed 手册第 4.13 节你可以做这样的事情:

n=10

(( n > 1 )) && script='1h; 2,'$n'{H;g;}; $q; 1,'$((n-1))'d; N; D'
(( n > 1 )) || script='$!d'

sed -i "$script" infile

答案4

tac|sed|tac>&&(mv||cat>)

以下两个命令片段都将有效删除除最后的5线~/file1如果你想保留最后的10线,你可以用|sed '1,5!d;'替换|sed '1,10!d;'等等,如您认为合适。

  1. tac ~/"file1" |sed '1,5!d;' |tac >"/tmp/file2" &&mv  "/tmp/file2"  ~/"file1"
  2. tac ~/"file1" |sed '1,5!d;' |tac >"/tmp/file2" &&cat "/tmp/file2" >~/"file1"

相关内容