Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在另一个字符串的两个匹配项之间查找字符串匹配项_String_Perl_Shell_Search_Scripting - Fatal编程技术网

String 在另一个字符串的两个匹配项之间查找字符串匹配项

String 在另一个字符串的两个匹配项之间查找字符串匹配项,string,perl,shell,search,scripting,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

我有一个很长的文件,如下所示

输入文件:-

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追加任何内容。 所以请帮我把代码写出来。谢谢。

我有一个perl解决方案

使用严格;
使用警告;
$/=“文本点”;
while(){
如果(/String/m){
打印“字符串\n”;
}
否则{
打印“-\n”;
}
}
使用perl一行程序

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

  • -0777
    :Slurp整个文件
  • -n
    :为输入文件中的每一行创建
    while(){…}
    循环
  • -e
    :告诉
    perl
    在命令行上执行代码
粘贴您尝试过的一些代码?sed-n'/Text point/{:a;n;/^\n/s/^\n/;/Text point/{p;s/*/};ba};'$1 | grep“String”>>Outfile,但问题是当找不到字符串时,它将不会向Outfile追加任何内容。不要在注释中放入代码在问题中放入代码/m只会影响与
^
$
匹配的内容,因此在那里是无用的;您的意思是
/^String$/m
?此方法将额外打印
-
,因为它将第一个
“文本点”
之前的空字符串视为一行。要修复此问题,可以将while循环的主体更改为just
print/String/?“字符串\n”:“-\n”如果$。>1;已尝试,但只提供了一半的输出:-(您对问题的描述不明确,我解释为比实际情况更困难。解决方案已修改,以符合我相信您的要求。
awk '/^Text Point/{print p; p="-" } /String/{ p=$0} END{print p}'  input
perl -0777 -ne 'print /(.*String.*\n)/ ? $1 : "-\n" for split /(?=Text Point)/' file