在指定的字符串后搜索元素

时间:2015-06-11 14:30:14

标签: tcl

我有一个脚本从文件中读取并按关键字排序某些行。我需要能够从这些发现的每一行中挑选出某个元素。文件中的行设置为谎言;

$(eval $(call CreateUvmTest, keyword, element_needed, morestuff...
$(eval $(call CreateUvmTest, keyword, element_needed, morestuff...
$(eval $(call CreateUvmTest, keyword, element_needed, morestuff...
$(eval $(call CreateUvmTest, keyword, element_needed, morestuff...

我试图找出如何用keyword读取行,然后只将element_needed写入文件。

示例:

该行将是

$(eval $(call CreateUvmTest, keyword, run_test_file, $(run_test_file.exten) tc_run_test_file.sv

我希望将此内容写入另一个名为listfile的文件中,该文件仅包含run_test_file

非常重要的是,它只需要包含keyword的行,因为可能会有相同的行;

$(eval $(call CreateUvmTest, NOT_keyword, run_test_file, $(run_test_file.exten) tc_run_test_file.sv

2 个答案:

答案 0 :(得分:2)

考虑到你的other问题,我猜你只有在包含$(eval $(call CreateTest, KEYWORD时才必须匹配这些行,我想你可能希望我们完全符合上述内容,然后提取所需的其他元素。

<强> input.txt中

$(eval $(call CreateUvmTest, NOT_keyword, run_test_file1, $(run_test_file.exten) tc_run_test_file.sv
$(eval $(call CreateUvmTest, keyword, run_test_file2, $(run_test_file.exten) tc_run_test_file.sv
$(eval $(call CreateUvmTest, NOT_keyword, run_test_file4, $(run_test_file.exten) tc_run_test_file.sv
$(eval $(call CreateUvmTest, NOT_keyword, run_test_file9, $(run_test_file.exten) tc_run_test_file.sv
$(eval $(call CreateUvmTest, keyword, run_test_file10, $(run_test_file.exten) tc_run_test_file.sv

<强> extractElement.tcl

set fp [open input.txt r]
set data [split [read $fp] \n]
close $fp
set outfile [open listfile.txt w] 
foreach line $data {
    if {[regexp {\$\(eval \$\(call CreateUvmTest, keyword, ([^,]+)} $line match element]} {
        puts $element; # Printing in console
        puts $outfile $element; # This goes to the file
    }
}
close $outfile

输出

run_test_file2
run_test_file10

使用正则表达式:

{\$\(eval \$\(call CreateUvmTest, keyword, ([^,]+)}

直到keyword,字面匹配,然后[^,]+匹配需要提取的元素。

注意:这是假设数据将在每一行用逗号分隔。

答案 1 :(得分:0)

鉴于您的意见,我有最好的想法:

给定此输入(行不匹配关键字):

> cat inputtcl.txt
$(eval $(call CreateUvmTest, keyword, element_needed, morestuff...
$(eval $(call CreateUvmTest, keyword, element_needed, morestuff...
$(eval $(call CreateUvmTest, keyword, element_needed, morestuff...
$(eval $(call CreateUvmTest, iNOT_keyword, element_needed, morestuff...
$(eval $(call CreateUvmTest, keyword, element_needed, morestuff...

使用此脚本:

> cat ./extract.tcl
#!/usr/bin/tclsh
set infile [open "$path1" r]
set outfile [open "$path0/listfile.txt" w]
set input [read $infile]
regsub -all {(?w)^.*?,\s*?sanity,\s*(.*?),.*$} $input {\1} output
puts $outfile $output

我得到了这个输出:

> cat output.txt
element_needed
element_needed
element_needed
element_needed

正则表达式匹配第一个,之前的任何内容然后检查任意数量的空格sanity后跟,跳过任意数量的空格然后捕获任何内容直到下一个{{1}然后匹配任何东西,直到行尾。 ,分别使(?w)^匹配开头和结尾。