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
说明:
开关:
:Slurp整个文件-0777
:为输入文件中的每一行创建-n
循环李>while(){…}
:告诉-e
在命令行上执行代码李>perl
^
或$
匹配的内容,因此在那里是无用的;您的意思是/^String$/m
?此方法将额外打印-
,因为它将第一个“文本点”
之前的空字符串视为一行。要修复此问题,可以将while循环的主体更改为justprint/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