如何使用sed来删除一个文件的最后n行(How to use sed to remove the l

2019-06-21 04:09发布

我想从一个文件的结尾处,删除了一些n行。 可以这样使用SED做?

例如,为了除去从2线至4,I可以使用

$ sed '2,4d' file

但我不知道的行号。 我可以使用删除最后一行

$sed $d file

但我想知道从末端删除n行的方式。 请让我知道如何在使用SED或其他一些方法来做。

Answer 1:

我不知道sed ,但它是可以做到的head

head -n -2 myfile.txt


Answer 2:

如果硬编码n是一个选项,你可以使用顺序调用sed的。 例如,要删除最后三行,三次删除最后一行:

sed '$d' file | sed '$d' | sed '$d'


Answer 3:

从sed的俏皮话 :

# delete the last 10 lines of a file
sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2

好像是你looing什么。



Answer 4:

一个有趣和简单sedtac的解决方案:

n=4
tac file.txt | sed "1,$n{d}" | tac

注意

  • 双引号"需要的外壳来评估$n变量sed命令。在单引号,没有插值将被执行。
  • taccat逆转,见man 1 tac
  • {}sed中有分开$nd (如果不是,壳尝试来内插不存在$nd变量)


Answer 5:

使用sed ,而是让壳做数学题,其目标是用d给予一个范围(除去最后23行)的命令:

sed -i "$(($(wc -l < file)-22)),\$d" file

要删除最后3行,从内到外:

$(wc -l < file)

给出了文件的行数:2196发言权

我们要删除的最后23行,所以左侧或范围:

$((2196-22))

得出:2174于是原来sed的后壳的解释是:

sed -i '2174,$d' file

随着-i做就地编辑,文件现在是2173线!

如果你想将其保存到一个新文件,代码为:

sed -i '2174,$d' file > outputfile


Answer 6:

你可以为这个使用

使用

$ head --lines=-N file > new_file

其中N是您想从文件中删除的行数。

原始文件的减去现在最后N行是NEW_FILE内容



Answer 7:

只是为了完整性我想补充我的解决方案。 我结束了与标准做这个ed

ed -s sometextfile <<< $'-2,$d\nwq'

这种使用就地编辑(尽管使用的临时文件删除最后2行/tmp !!)



Answer 8:

要截断非常大的文件真正就地我们必须truncate命令。 它不知道台词,但tail + wc可以行转换为字节:

file=bigone.log
lines=3
truncate -s -$(tail -$lines $file | wc -c) $file

但如果该文件是在同一时间写了一个明显的竞争条件。 在这种情况下,它可能是更好的使用head -它计算从文件(记磁盘IO)的开始字节,所以我们会一直线边界(可能更多行,如果文件正在积极写于预期)上截断:

truncate -s $(head -n -$lines $file | wc -c) $file

便捷的单行如果你失败的登录尝试把密码代替用户名:

truncate -s $(head -n -5 /var/log/secure | wc -c) /var/log/secure


Answer 9:

这可能会为你工作(GNU SED):

sed ':a;$!N;1,4ba;P;$d;D' file


Answer 10:

这里的答案,你已经了解到,SED是不是这个应用程序的最佳工具。

不过,我觉得有一种方法,使用SED做到这一点; 这个想法是追加N行,直到你没有击中EOF能够读取保存空间。 当EOF被击中,打印保存空间的内容,并退出。

sed -e '$!{N;N;N;N;N;N;H;}' -e x

以上sed命令将省略最后5行。



Answer 11:

最上面的答案似乎需要GNU命令/扩展:

    $ head -n -2 myfile.txt
    -2: Badly formed number

对于一个稍微portible的解决方案:

     perl -ne 'push(@fifo,$_);print shift(@fifo) if @fifo > 10;'

要么

     perl -ne 'push(@buf,$_);END{print @buf[0 ... $#buf-10]}'

要么

     awk '{buf[NR-1]=$0;}END{ for ( i=0; i < (NR-10); i++){ print buf[i];} }'

其中 “10” 是 “N”。



Answer 12:

试试下面的命令:

n = line number
tail -r file_name | sed '1,nd' | tail -r


Answer 13:

你可以用线的总数wc -l <file>和使用

head -n <total lines - lines to remove> <file>



Answer 14:

它可以在3个步骤来完成:

一)算你要编辑的文件中的行数:

 n=`cat myfile |wc -l`

b)由该号码删除的行数减:

 x=$((n-3))

C)告诉SED从该行号(删除$x ),以结束:

 sed "$x,\$d" myfile


Answer 15:

我喜欢这个解决方案;

head -$(gcalctool -s $(cat file | wc -l)-N) file

其中N是线去除的数量。



Answer 16:

sed -n ':pre
1,4 {N;b pre
    }
:cycle
$!{P;N;D;b cycle
  }' YourFile

POSIX版本



Answer 17:

要删除最后4行:

$ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'   


Answer 18:

我想出了这一点,其中n是要删除的行数:

count=`wc -l file`
lines=`expr "$count" - n`
head -n "$lines" file > temp.txt
mv temp.txt file
rm -f temp.txt

这是一个有点迂回,但我认为这很容易效仿。

  1. 计数的行数在主文件
  2. 减去行数要从计数删除
  3. 打印出的线条要保持和数字存储在Temp文件
  4. 与临时文件替换主文件
  5. 删除临时文件


Answer 19:

这将删除从最后3行file

for i in $(seq 1 3); do sed -i '$d' file; done;



Answer 20:

这将删除的最后12行

sed -n -e :a -e '1,10!{P;N;D;};N;ba'


Answer 21:

对于删除文件的最后N行,你可以使用相同的概念

$ sed '2,4d' file

可以使用组合具有尾命令扭转文件:如果N为5

$ tail -r file | sed '1,5d' file | tail -r > file

而且这种方式也运行在那里head -n -5 file命令不运行(如在Mac上!)。



文章来源: How to use sed to remove the last n lines of a file