Chinaunix

标题: 从匹配行往上找最近的另一个匹配,然后打印两行之间 [打印本页]

作者: mystérieux    时间: 2013-08-19 08:39
标题: 从匹配行往上找最近的另一个匹配,然后打印两行之间
本帖最后由 mystérieux 于 2013-08-19 08:41 编辑

从匹配行往上找最近的另一个匹配,然后打印两行之间。这个我已经做出来了,请各位品鉴,再看下如何润色一下,或者还有什么其它的做法。

文本内容:

1 A B C
2 D E F ONE
3 G H I ONE
4 J K L
5 M N O
6 P Q R
7 S T U ONE
8 V W X
9 Y Z TT
10 AA BB CC ONE
11 DD EE FF
12 lu lu la ONE
13 ca ca ca
14 pu pu pi
15 he ha he
16 pe pi pa
17 fi fa fe
18 Ya Yu Yi
19 Ze Zi Zu     TWO
20 Ti Ta Te TWO
21 wahaha
22 qiqiq ONE TWO
23 smith
24 great TWO
25 autumn
26 object       ONE
27 mean TWO
28 TWY
29 Lucie
30 Ppe ONE

找到第一个含有TWO的行,再住上找最近一个含有ONE的行,只把中间的行打印出来。我是这样做的:
  1. sed -n   ':a;/ONE/n;N;/TWO/!ba;p;q'  file
复制代码
思路是,如果碰到ONE,就把多行模式空间用下一行代替,重新开始多行模式空间,在这个循环中如果遇到一个TWO,就跳出该循环。
作者: WilliBhamlll    时间: 2013-08-19 09:30
  1. sed -n 'H;/ONE/{n;h};/TWO/{x;p;q}' file
复制代码

作者: yinyuemi    时间: 2013-08-19 09:30
回复 1# mystérieux
  1. sed -n '/TWO/{g;p;q};H;/ONE/{n;h}'
复制代码

作者: zxd_echo    时间: 2013-08-19 10:02
awk 'f==1&&/TWO/{for(x=0;x<i;x++)print a[x];exit}/ONE/{if(f==1){delete a;i=0;next;}else{f=1;a[i++]=$0;}}f{a[i++]=$0}' tmp
作者: reyleon    时间: 2013-08-19 10:54
本帖最后由 reyleon 于 2013-08-19 11:27 编辑
  1. awk '{a[NR]=$0}/ONE/{n=NR}/TWO/{for(i=n+1;i<NR;i++)print a[i];exit}'
复制代码

作者: jason680    时间: 2013-08-19 11:08
回复 1# mystérieux

Would you like it by awk

$ sed -n   ':a;/ONE/n;N;/TWO/!ba;p;q'  file
13 ca ca ca
14 pu pu pi
15 he ha he
16 pe pi pa
17 fi fa fe
18 Ya Yu Yi
19 Ze Zi Zu     TWO

$ awk 'P{S=S$0"\n"}/ONE/{P=1;S=""}/TWO/{printf S;exit}' file
13 ca ca ca
14 pu pu pi
15 he ha he
16 pe pi pa
17 fi fa fe
18 Ya Yu Yi
19 Ze Zi Zu     TWO
   
作者: seesea2517    时间: 2013-08-19 13:19
好的方法上面都有了,弄个不好的:
  1. [seesea@UC ~]$ sed -rn 'H; /TWO/{g; s/.*\n([^\n]*ONE)/\1/; p; q}' file
  2. 12 lu lu la ONE
  3. 13 ca ca ca
  4. 14 pu pu pi
  5. 15 he ha he
  6. 16 pe pi pa
  7. 17 fi fa fe
  8. 18 Ya Yu Yi
  9. 19 Ze Zi Zu     TWO
复制代码

作者: mystérieux    时间: 2013-08-19 18:06
谢谢各位参与,白天还有点事,晚上我再认真看你们的作品。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2