【问题标题】:How to extract a particular pattern from a file? [closed]如何从文件中提取特定模式? [关闭]
【发布时间】:2013-05-27 13:35:04
【问题描述】:

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

#### >>> 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

【问题讨论】:

  • Item number 是在一系列数字之前的固定字符串,还是只是一系列数字?
  • 到目前为止你尝试过什么?不要期望人们为您完成所有编码。特别是如果您提到它是紧急的,它没有帮助。人们是自愿来这里帮忙的,所以不要给他们施加压力。
  • 对于第 3 项,名称是“ppppp”还是“ppppp\neeee\nrrrrrr”?

标签: perl unix scripting tcl


【解决方案1】:
perl -00nE 'say $1 if /Result\s+PASS/ and /name\s+(.+)/i' file

【讨论】:

    【解决方案2】:

    您在问题中添加了 标签,因此是 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
    

    【讨论】:

      【解决方案3】:

      使用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。
      • 向后搜索带有名称的行。
      • 获取该行的内容。
      • 将光标设置在名称所在的行中。
      • 将其打印到输出文件。
      • 将光标返回到成功结果行的最后一个匹配项的下一行
      • 关闭文件。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-13
          • 2012-05-13
          • 1970-01-01
          • 2016-06-04
          • 2020-06-02
          • 2021-07-29
          • 2018-05-23
          相关资源
          最近更新 更多