2015-05-27 45 views
0

删除了比赛,两行它的工作原理之前:在两个方向删除n行和sed中的匹配?

sed -i.bak -e '/match/,-2d' someCommonName.txt 

删除了比赛,两行它的工作原理后:

sed -i.bak -e '/match/,+2d' someCommonName.txt 

但删除了比赛,后两行,前两行它不起作用?

sed -i.bak -e '/match/-2,+2d' someCommonName.txt 
sed: -e expression #1 unknown command: `-' 

这是为什么?

+0

那''/ somedir/*/someCommonName.txt'太危险了吗? – leeand00

+0

第一个对我不起作用:'seq 10 |例如,sed -e'/ 5 /, - 2d''返回“sed:-e表达式#1,字符5:意外的','”错误。事实上,我怀疑第一个命令是否对你有用。请参阅[使用sed(或awk)]删除上述模式行的范围](http://unix.stackexchange.com/q/29906/40596)。 – fedorqui

+2

这不是危险的,只是难以阅读并进入重点 – fedorqui

回答

2

我没有一个完整的解决方案,但提纲:sed是一个非常简单的工具,它不会一次执行两件事。我的做法是运行sed,一旦删除模式后的两行,但保留模式本身。然后可以再次将结果传送到sed以删除之前的模式和两行。

2

sed在一系列地址上运行。这意味着一个或两个表达式,而不是三个。

/match/是一个匹配正则表达式的地址。

-2是指定两行的地址之前

+2是指定后

因此两行的地址:

/match/,-2是指定匹配之前match到两条线的线的范围内。另一方面,

/match/-2,+2d包括三个地址,因此是没有意义的。

要删除两行之前和模式之后,我会推荐这样的事情(modified from this answer):

sed -n "1N;2N;/\npattern$/{N;N;d};P;N;D" 

这使得在缓冲区3线,并通过读取文件。当在最后一行中找到该模式时,它会再读取两行并删除所有5.请注意,如果该模式位于文件的前两行,则该模式不起作用,但它是一个开始。

2
sed -i .bak '/match/,-2 {/match/!d;};/match/,+2d' YourFile 

试试这个(不能在这里测试,-2不可用在我的sed版本)

+0

@nerronLeVelu任何想法你需要什么版本?我运行的是Ubuntu 14.04 LTS,它只是随它一起提供的......但是如果我需要获得单独的软件包或重新编译它或某个东西,我就是为了这个游戏。 – leeand00

1

FWIW这是我怎么会真的做的工作(只是改变ba值删除不同的号码行前/后match发现):

$ cat file 
1 
2 
3 
4 
5 match 
6 
7 
8 
9 

$ awk -v b=2 -v a=2 'NR==FNR{if (/match/) for (i=(NR-b);i<=(NR+a);i++) skip[i]; next } !(FNR in skip)' file file 
1 
2 
8 
9 

$ awk -v b=3 -v a=1 'NR==FNR{if (/match/) for (i=(NR-b);i<=(NR+a);i++) skip[i]; next } !(FNR in skip)' file file 
1 
7 
8 
9 

注意上面的假设,当2“匹配” S出现在去除窗口中要立足于原有发生缺失,而不是世界卫生大会吨会发生被找到的第一个匹配使所述第二匹配要被删除后:

$ cat file2 
1 
2 
3 
4 match 
5 
6 match 
7 
8 
9 

$ awk -v b=2 -v a=2 'NR==FNR{if (/match/) for (i=(NR-b);i<=(NR+a);i++) skip[i]; next } !(FNR in skip)' file2 file2 
1 
9 

,而不是输出是:在删除该2行第一match之后将删除

1 
7 
8 
9 

第二个match,所以THAT后面的2行不会被删除,因为它们不会在match之后的2行内。

别的东西来考虑:

$ diff --changed-group-format='%<' --unchanged-group-format='' file <(grep -A2 -B2 match file) 
1 
2 
8 
9 

$ diff --changed-group-format='%<' --unchanged-group-format='' file2 <(grep -A2 -B2 match file2) 
1 
9 

使用bash和GNU的diff 3.2,IDK的如果/哪些其他壳/ diff文件将支持这些构造/选项。