我想从文件末尾删除一些 n 行。可以使用sed完成吗?
例如,要删除2到4行,我可以使用
$ sed '2,4d' file
但我不知道行号。我可以使用
删除最后一行$sed $d file
但我想知道从最后删除 n 行的方法。请告诉我如何使用sed或其他方法来做到这一点。
答案 0 :(得分:186)
我不知道sed
,但可以使用head
完成:
head -n -2 myfile.txt
答案 1 :(得分:26)
如果硬编码n是一个选项,您可以使用顺序调用sed。例如,要删除最后三行,请删除最后一行三次:
sed '$d' file | sed '$d' | sed '$d'
答案 2 :(得分:24)
# 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
似乎是你在寻找的东西。
答案 3 :(得分:20)
一个有趣的&简单的sed
和tac
解决方案:
n=4
tac file.txt | sed "1,$n{d}" | tac
注意强>
"
来评估$n
命令中的sed
变量。在单引号中,不会执行插值。tac
被cat
反转,请参阅man 1 tac
{}
中的sed
分隔$n
& d
(如果没有,shell会尝试插入不存在的$nd
变量)答案 4 :(得分:14)
使用sed
,但让shell进行数学运算,目标是通过给出范围(删除最后23行)来使用d
命令:
sed -i "$(($(wc -l < file)-22)),\$d" file
从内到外删除最后3行:
$(wc -l < file)
给出文件的行数:说 2196
我们要删除最后23行,因此对于左侧或范围:
$((2196-22))
给予: 2174 因此,shell解释后的原始sed是:
sed -i '2174,$d' file
-i
进行现场编辑,文件现在 2173 行!
如果要将其保存到新文件中,代码为:
sed -i '2174,$d' file > outputfile
答案 5 :(得分:10)
您可以使用 head 。
使用
$ head --lines=-N file > new_file
其中N是您要从文件中删除的行数。
原始文件的内容减去最后N行现在位于 new_file
答案 6 :(得分:7)
为了完整起见,我想补充一下我的解决方案。
我最终使用标准ed
:
ed -s sometextfile <<< $'-2,$d\nwq'
这会使用就地编辑删除最后两行(尽管 使用/tmp
中的临时文件!!)
答案 7 :(得分:5)
要真正截断非常大的文件,我们有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
答案 8 :(得分:4)
这可能适合你(GNU sed):
sed ':a;$!N;1,4ba;P;$d;D' file
答案 9 :(得分:2)
上述大多数答案似乎都需要GNU命令/扩展名:
$ head -n -2 myfile.txt
-2: Badly formed number
稍微提高一些解决方案:
perl -ne 'push(@fifo,$_);print shift(@fifo) if @fifo > 10;'
OR
perl -ne 'push(@buf,$_);END{print @buf[0 ... $#buf-10]}'
OR
awk '{buf[NR-1]=$0;}END{ for ( i=0; i < (NR-10); i++){ print buf[i];} }'
“10”是“n”。
答案 10 :(得分:2)
尝试以下命令:
n = line number
tail -r file_name | sed '1,nd' | tail -r
答案 11 :(得分:2)
通过这里的答案,您已经了解到sed不是此应用程序的最佳工具。
但是我确实认为使用sed有一种方法可以做到这一点;我的想法是附加N行来保持空间,直到你能够阅读而不会击中EOF。点击EOF时,打印保留空间的内容并退出。
sed -e '$!{N;N;N;N;N;N;H;}' -e x
上面的sed命令将省略最后5行。
答案 12 :(得分:1)
您可以使用wc -l <file>
获取行总数并使用
head -n <total lines - lines to remove> <file>
答案 13 :(得分:1)
可以分3个步骤完成:
a)计算要编辑的文件中的行数:
n=`cat myfile |wc -l`
b)从该数字中减去要删除的行数:
x=$((n-3))
c)告诉sed从该行号($x
)删除到结尾:
sed "$x,\$d" myfile
答案 14 :(得分:0)
要删除文件的最后N行,可以使用相同的概念
$ sed '2,4d' file
您可以使用带尾巴的组合命令来反转文件:如果N为5
$ tail -r file | sed '1,5d' file | tail -r > file
而且这种方法也可以在head -n -5 file
命令没有运行的地方运行(就像在Mac上一样!)。
答案 15 :(得分:0)
在docker中,这对我有用:
fetch
答案 16 :(得分:0)
这将删除最后12行
sed -n -e :a -e '1,10!{P;N;D;};N;ba'
答案 17 :(得分:0)
#!/bin/sh
echo 'Enter the file name : '
read filename
echo 'Enter the number of lines from the end that needs to be deleted :'
read n
#Subtracting from the line number to get the nth line
m=`expr $n - 1`
# Calculate length of the file
len=`cat $filename|wc -l`
#Calculate the lines that must remain
lennew=`expr $len - $m`
sed "$lennew,$ d" $filename
答案 18 :(得分:0)
这将删除file
中的最后3行:
for i in $(seq 1 3); do sed -i '$d' file; done;
答案 19 :(得分:0)
我想出了这个,其中n是你要删除的行数:
count=`wc -l file`
lines=`expr "$count" - n`
head -n "$lines" file > temp.txt
mv temp.txt file
rm -f temp.txt
这有点迂回,但我认为这很容易理解。
答案 20 :(得分:0)
sed -n ':pre
1,4 {N;b pre
}
:cycle
$!{P;N;D;b cycle
}' YourFile
posix版
答案 21 :(得分:0)
要删除最后4行:
$ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'
答案 22 :(得分:0)
我更喜欢这个解决方案;
head -$(gcalctool -s $(cat file | wc -l)-N) file
其中 N 是要删除的行数。