搜索指定字符串后的元素

Search for element after a designated string

我有一个脚本,它从一个文件中读取并通过关键字对某些行进行排序。我需要能够从这些发现的每条线中挑选出某个元素。文件中的行设置为:

$(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

考虑到你的意见,我有最好的想法:

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

> 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 {} output
puts $outfile $output

我得到这个输出:

> cat output.txt
element_needed
element_needed
element_needed
element_needed

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

考虑到你的 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,按字面匹配,然后[^,]+匹配需要提取的元素。

注意:这是假设每行数据用逗号分隔写的