有没有办法将这种模式与shell或sed相匹配?

时间:2012-04-12 04:17:00

标签: shell sed

我有一个包含以下输出的文件:

BP 0 test:
    case    id          Name            
    ======  ========  =================
         0        82  a_case-2-0-0      

BP 1 test:
    case    id          Name            
    ======  ========  =================
         0        86  a_case-2-1-0      

BP 2 test:
    case    id          Name            
    ======  ========  =================


BP 3 test:
    case    id          Name            
    ======  ========  =================
         0        93  a_case-2-3-0 

所以,只有“BP 0,1,3”有内容,所以我想要的是,是否有可能只转储'BP 0测试','BP 1测试'和'BP 3测试',只是想由于没有测试用例,因此进行了“BP 2测试”。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

虽然您可以使用[expr等较小的shell工具一起打击某些内容,但使用awk更容易实现这一点,您通常可以在操作系统还包括grepsed。 :)

这是一个快速和肮脏的:

[ghoti@pc ~]$ cat doit 
#!/usr/bin/awk -f

/^BP/ {
  output=$0;
  getline; output=sprintf("%s\n%s", output, $0);
  getline; output=sprintf("%s\n%s", output, $0);
  getline;
  if (/[0-9]/) {
    output=sprintf("%s\n%s\n", output, $0);
    print output;
  }
}

[ghoti@pc ~]$ ./doit input.txt 
BP 0 test:
    case    id          Name            
    ======  ========  =================
         0        82  a_case-2-0-0      

BP 1 test:
    case    id          Name            
    ======  ========  =================
         0        86  a_case-2-1-0      

BP 3 test:
    case    id          Name            
    ======  ========  =================
         0        93  a_case-2-3-0 

[ghoti@pc ~]$ 

请注意,此脚本假定您输入数据的某些内容。如果if语句中的条件不适合您,或者在单次测试后可能出现多个案例,则需要调整此脚本。

答案 1 :(得分:3)

$ awk -F'\n' -v RS='' -v ORS='\n\n' 'NF>3' input.txt
BP 0 test:
    case    id          Name
    ======  ========  =================
         0        82  a_case-2-0-0

BP 1 test:
    case    id          Name
    ======  ========  =================
         0        86  a_case-2-1-0

BP 3 test:
    case    id          Name
    ======  ========  =================
         0        93  a_case-2-3-0

答案 2 :(得分:2)

如果你的grep支持-B选项,那么你可以这样做

grep -B3 "_case-" <ip_file> | grep "BP "

以上的输出是

BP 0 test:
BP 1 test:
BP 3 test:

这里-B3在匹配模式上方打印3行。

答案 3 :(得分:0)

这可能对您有用:

sed 'N;N;N;$!N;/\n\n$/d' file