使用perl进行条件搜索

时间:2014-09-03 23:18:22

标签: perl

这是我的输入文件:

Test1
{
 abc
 jkl
 mno
 search_text
 pqr
}
Test2
{
 stu
 vwx
}
Test3
{
 yza
 search_text
 bcd
}

问题:如果存在" search_text"则打印测试名称(Test1,Test2,Test3等)。在那个测试的花括号之间。

从put文件中给出的预期输出:

Test1
Test3

1 个答案:

答案 0 :(得分:0)

这个单行做你需要的:

perl -lne'
BEGIN { $/ = "}" } 
if ( /search_text/ ) { 
    $match = $.==1 ? (split "\n")[0] : (split "\n")[1]; 
    print $match; 
}' file
Test1
Test3

说明:

  • -l:处理时换行换行符并在打印过程中将其放回。
  • -n:创建一个隐式while(<>) { ... }循环来处理每一行。
  • -e:告诉perl解释器执行其后的代码。
  • $/:在BEGIN块中,我们将输入字段分隔符设置为},而不是默认换行符。
  • 由于我们的工作线已经有效地转换为由}分隔的行块,因此我们测试该行是否包含search_text。如果是这样,我们通过在换行上分割线来放置所需的文本,如果它是我们的第一行,我们捕获第一个分割,否则我们捕获第二个分割并打印文本。