这是我的输入文件:
Test1
{
abc
jkl
mno
search_text
pqr
}
Test2
{
stu
vwx
}
Test3
{
yza
search_text
bcd
}
问题:如果存在" search_text"则打印测试名称(Test1,Test2,Test3等)。在那个测试的花括号之间。
从put文件中给出的预期输出:
Test1
Test3
答案 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
。如果是这样,我们通过在换行上分割线来放置所需的文本,如果它是我们的第一行,我们捕获第一个分割,否则我们捕获第二个分割并打印文本。