在两次出现的其他事件之间查找字符串出现

时间:2014-06-25 05:41:17

标签: string perl shell search scripting

我的文件很长,如下所示。

输入文件: -

Text Point
Blah
Blah
Blah
Blah
Blah
Blah
String
Blah
Blah
Blah
Blah
Blah
Blah
Text Point
Blah
Blah
Blah
Blah
Blah
Blah
Text Point
String
Blah
Blah
Text Point
Blah
Blah
Blah
String
Blah
Blah
Blah
Text Point
Blah
Blah
String
Blah

每次出现“文字点”后,在下次出现之前,我都希望'字符串'最多发生一次。如果在输出文件的两个连续“文本”点之间发生字符串,我就会提取字符串。如果没有出现,我还要设置短划线。

在这种情况下,我需要像这样的输出

String
-
String
String
String

我尝试使用以下命令

sed -n '/Text point/{:a;N;/^\n/s/^\n//;/Text point/{p;s/.*//;};ba};' $1 | grep "String" >> Outfile 

但问题是当字符串未被发现时它不会向outfile附加任何内容。 所以请帮我解决问题。感谢。

3 个答案:

答案 0 :(得分:1)

我有 perl

的解决方案
use strict;
use warnings;

$/="Text Point";

while(<>) {

    if(/String/m) {
        print "String \n" ;
    }
    else{
        print "- \n"    ;   
    }
}

答案 1 :(得分:0)

awk '/^Text Point/{print p; p="-" } /String/{ p=$0} END{print p}'  input

答案 2 :(得分:0)

使用perl one-liner

perl -0777 -ne 'print /(.*String.*\n)/ ? $1 : "-\n" for split /(?=Text Point)/' file

说明:

切换

  • -0777:Slurp整个文件
  • -n:为输入文件中的每个“行”创建一个while(<>){...}循环。
  • -e:告诉perl在命令行上执行代码。