搜索指定字符串后的元素
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,
按字面匹配,然后[^,]+
匹配需要提取的元素。
注意:这是假设每行数据用逗号分隔写的
我有一个脚本,它从一个文件中读取并通过关键字对某些行进行排序。我需要能够从这些发现的每条线中挑选出某个元素。文件中的行设置为:
$(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,
按字面匹配,然后[^,]+
匹配需要提取的元素。
注意:这是假设每行数据用逗号分隔写的