0

我有一个格式如下的文件:

#### >>> 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 numberto提取Result到文件中?如果 Result PASS,我需要打印Name模式的。

4

4 回答 4

1

您在问题中添加了一个标签,因此是一个 tcl 答案。

鉴于您所展示的内容,我会将文件视为包含特定于域的命令的 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
于 2013-05-31T18:51:46.467 回答
1
perl -00nE 'say $1 if /Result\s+PASS/ and /name\s+(.+)/i' file
于 2013-05-31T17:16:03.397 回答
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

脚步:

  • 搜索结果为“通过”的行。
  • 检查不是EOF。
  • 向后搜索具有该名称的行。
  • 获取该行的内容。
  • 将光标设置在名称所在的行中。
  • 将其打印到输出文件。
  • 将光标返回到成功结果行的最后一个匹配项的下一行
  • 关闭文件。
于 2013-05-31T21:34:23.373 回答
-1

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

于 2013-05-31T17:01:13.790 回答