Perl 如何从文件中提取特定模式?
我有一个如下格式的文件:Perl 如何从文件中提取特定模式?,perl,unix,scripting,tcl,Perl,Unix,Scripting,Tcl,我有一个如下格式的文件: #### >>> start of File Item number - 1 Name xxxx yyyy Result PASS Item number - 2 Name yyyyy yyyy Result FAIL Item number - 3 NAME ppppp eeee rrrrr Result PASS #### >>> End of File 现在我的问题是,我如何从中提取完整的模式 项目编号到结果到文件?
#### >>> start of File
Item number - 1
Name xxxx
yyyy
Result PASS
Item number - 2
Name yyyyy
yyyy
Result FAIL
Item number - 3
NAME ppppp
eeee
rrrrr
Result PASS
#### >>> End of File
现在我的问题是,我如何从中提取完整的模式
项目编号
到结果
到文件?如果
结果传递
,我需要打印模式的名称
。如果文件不是太大,并且您有一个固定的行数,您可以在内存中获取整个文件(在一个数组中),然后解析数组,并在其中找到传递输出前4行。您在问题中添加了一个标记,因此得到了tcl答案
perl -00nE 'say $1 if /Result\s+PASS/ and /name\s+(.+)/i' file
根据您所展示的内容,我会将该文件视为包含特定于域的命令的tcl脚本——在安全解释器中执行“脚本”
set safe [interp create -safe]
interp share "" stdout $safe ;# give the safe interp access to stdout
interp eval $safe { ;# set up the DSL
proc unknown args {}
proc Name args {set ::name [join $args]}
proc Result result {if {$result eq "PASS"} {puts $::name}}
}
interp alias $safe NAME $safe Name ;# oops, need better control over the data
# do it
interp invokehidden $safe source ./file
单向使用
vim
。可以从命令行运行它:
vim -c '
while 1
let l_result = search( "\\v\\c^result\\s+pass\\s*$", "W" )
if l_result == 0
break
endif
let l_name = search( "\\v\\c^name\\s+", "b" )
let name_l_str = getline( l_name )
call cursor( l_name, 1 )
. write! >> outfile
call setpos( ".", [0, l_result + 1, 1, 0] )
endwhile
q!
' infile
它产生:
Name xxxx
NAME ppppp
步骤:
- 搜索结果为“通过”的行
- 不检查EOF
- 向后搜索带有名称的行
- 获取行的内容
- 在具有名称的行中设置光标
- 将其打印到输出文件
- 将光标返回到成功结果行最后一个匹配的下一行
- 关闭文件
项目编号
在一系列数字之前的固定字符串,还是仅仅是一系列数字?到目前为止您尝试了什么?不要期望人们为你做所有的编码。特别是,如果你提到它是紧急的,它是没有帮助的。这里的人们是自愿帮助的,所以不要给他们施加压力。第3项的名称是“ppppp”还是“ppppppp\neeee\nrrrrrr”?