如何从文件中提取特定模式?

时间:2013-05-31 16:53:07

标签: 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

现在我的问题是,如何从中提取完整的模式 Item numberResult到文件?如果 Result PASS,我需要打印模式的Name

5 个答案:

答案 0 :(得分:3)

awk '/Result PASS/ {print $2}' FS='\n' RS='\n\n'

结果

Name xxxx
NAME ppppp

答案 1 :(得分:1)

perl -00nE 'say $1 if /Result\s+PASS/ and /name\s+(.+)/i' file

答案 2 :(得分:1)

您在问题中添加了标记,因此请回答。

鉴于您所展示的内容,我会将该文件视为包含特定于域的命令的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

答案 3 :(得分:0)

使用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

步骤:

  • 搜索结果为“pass”的行。
  • 检查不是EOF。
  • 向后搜索具有名称的行。
  • 获取该行的内容。
  • 将光标放在带有名称的行中。
  • 将其打印到输出文件。
  • 将光标返回到成功结果行的最后一个匹配的下一行
  • 关闭文件。

答案 4 :(得分:-1)

如果文件不是太大而且你有一定数量的行,你可以把整个文件放在内存中(在一个数组中),然后解析数组,然后找到PASS输出前4行。