我有一个脚本从文件中读取并按关键字排序某些行。我需要能够从这些发现的每一行中挑选出某个元素。文件中的行设置为谎言;
$(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
答案 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)
和^
匹配开头和结尾。