我有一个文件格式如下:
#### >>> 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 number
到Result
到文件?如果
Result PASS
,我需要打印模式的Name
。
答案 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标记,因此请回答。
鉴于您所展示的内容,我会将该文件视为包含特定于域的命令的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
步骤:
答案 4 :(得分:-1)
如果文件不是太大而且你有一定数量的行,你可以把整个文件放在内存中(在一个数组中),然后解析数组,然后找到PASS输出前4行。