【发布时间】:2013-07-19 08:56:12
【问题描述】:
我有一个文件,其中包含一些行和一些数字。我想删除特定字符串之后的所有行,让我们说字符串是“角度”。我想删除角度后的所有线,我可以使用 sed 命令执行此操作,如下所示:
sed -n '/angles/q;p' input file
我的问题是,我想删除角度之后的所有线,但想保留最后四行?我怎样才能在 sed 中做到这一点?
【问题讨论】:
我有一个文件,其中包含一些行和一些数字。我想删除特定字符串之后的所有行,让我们说字符串是“角度”。我想删除角度后的所有线,我可以使用 sed 命令执行此操作,如下所示:
sed -n '/angles/q;p' input file
我的问题是,我想删除角度之后的所有线,但想保留最后四行?我怎样才能在 sed 中做到这一点?
【问题讨论】:
以下内容应该适合您:
tac inputfile | sed '5,/angles/d' | tac
说明:反转文件,保留前 4 行并删除所有内容,直到遇到所需的模式。反转结果。
【讨论】:
sed '5,/angles/d' 将删除从第 5 行到(包括)模式 angles.@user1407199 所说的 'I want to delete all the lines after angles' 的所有内容
这可能对你有用(GNU sed):
sed '1,/angles/b;:a;$!{N;s/\n/&/4;Ta;D}' file
打印出从第一行到遇到字符串angles 的所有行。然后制作一个四行的移动window 并将它们打印在文件末尾。
【讨论】:
在 awk 中:
awk '{
if(p!=1)print;
else{a[NR]=$0}
if($0~/angles/)p=1
}
END{
for(i=NR-3;i<=NR;i++)print a[i]
}' your_file
测试如下:
> cat temp
wbj
ergthet
gheheh
wergergkn angles gerg
er
ergnmer
rgnerk
1
2
3
4
> awk '{if(p!=1)print;else{a[NR]=$0};if($0~/angles/)p=1}END{for(i=NR-3;i<=NR;i++)print a[i]}' temp
wbj
ergthet
gheheh
wergergkn angles gerg
1
2
3
4
>
【讨论】:
awk -v size=$(wc -l < file) '
/angles/ { skip=1 }
NR >= (size-4) { skip=0 }
!skip
' file
【讨论】:
我将假设您要查找的字符串可能不止一次出现,并且您只想要第一个。如果这是真的,那么反转文件并不是最好的策略。
{ sed '/angles/q' file; tail -4 file; } > result
【讨论】: