linux 当且仅当目标图案“target”出现在“start”和“end”之间时,打印“start”和“end”之间的所有行

kulphzqa  于 2023-02-03  发布在  Linux
关注(0)|答案(1)|浏览(127)

我想使用linux shell来搜索目录中的所有文件,并查看任何文件中的行,这些行的目标模式介于已知的开始模式和结束模式之间。

blah blah
blah blah blah
blah start blah
blah
target
blah blah
end blah
blah 
blah

我想回去

blah start blah
blah
target
blah blah
end blah

我试过了

sed -n '/start/,/end/{/target/p}' file.txt

它只搜索一个文件,并且不会显示从开始到结束的整个时间间隔。我使用grep和awk失败了(可能反映了我缺乏经验)。
非常感谢。

oxcyiej7

oxcyiej71#

有不同的方法可以做到这一点。如果不安装一些额外的软件,我建议使用Perl,因为它可能已经安装在您的系统上。

perl -0ne 'print "$&\n" while /^[^\r\n]*?start.*?target.*?end.*?$/gms' file.txt

这里。
'-0'命令行开关基本上使perl将整个文本文件作为一行读取(它将行分隔符设置为代码为0的字符,而不是通常的'\n')。
perl使用"-n"开关执行表达式,对于每一行输入使用"-e"开关指定,并且默认情况下不打印结果。
所以,这一行代码的工作原理与下面的伪代码类似:

set line separator to byte 0, in practice gobble the whole text file at once;
while (there are some lines to read from the input) {
   read the line;
   while (the line matches the regex /^[^\r\n]*?start.*?target.*?end.*?$/ms) {
      print the whole match, followed by "\n";
   }
}

相关问题