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”?