2015-06-04 2 views
0

Я пишу сценарий tcl, который читает из файла и отображает определенные строки из этого файла. Я могу читать из файла n проблемы, но я не могу понять, как выбрать определенные строки, прежде чем фильтровать то, что мне не нужно. Я читаю файл в списке, а затем используя следующий код, чтобы отфильтровать его;Выберите некоторые строки из файлов

proc listFromFile {/.../.../.../file_test.file} { 
set f [open /.../.../.../file_test.file r] 
set data [split [string trim [read $f]]] 
close $f 
return $data 
} 
set f [listFromFile /.../.../.../file_test.file] 
set f [lsort -unique $f] 
set f [lsearch -all -inline $f "test_*" 

Строки внутри файла выглядеть

$(eval $(call CreateUvmTest, other, test_runtest1 ... 
$(eval $(call CreateUvmTest, KEYWORD, test_runtest2 ... 
$(eval $(call CreateUvmTest, KEYWORD, test_runtest3 ... 
$(eval $(call CreateUvmTest, other, test_runtest4 ... 

Как бы выделить строки, содержащие KEYWORD в целом, прежде чем я отфильтровывать все остальное мне не нужно? Строки, содержащие KEYWORD, случайным образом находятся внутри файла вместе с другими тестами. Возможно ли это вообще?

+0

Теперь _that_ неожиданное название для формальной переменной параметра! –

ответ

0

Это не должно быть сложно. Начнем с того, вы, вероятно, хотите разделить содержимое файла на разрывы строк:

set data [split [string trim [read $f]] \n] 

Когда вы сделаете это, вы могли бы использовать ряд методов, чтобы выбрать строки, которые вы хотите, например,

lsearch -all -inline $data *KEYWORD* 

Документация: lsearch, read, set, split, string

+0

Спасибо, что он отлично работает. Я искал везде, я не думал, что это будет что-то настолько тонкое. Life saver :) –

+0

Вы говорите о том, что его читали из другого каталога? Тестовый файл находится в другом каталоге, кроме сценария tcl. Im довольно новый с tcl, поэтому любые предложения приветствуются –

+0

@LiamP: нет, я говорю о передаче значений аргументов в команду. Посмотрите (здесь) (http://www.beedub.com/book/2nd/tclintro.doc.html) например (прокрутите вниз до «Процедуры»). –

0

я бы сильно рассмотреть

set lines [split [exec grep -Fw KEYWORD file_test.file] \n] 

В противном случае

proc select_lines {filename keyword} { 
    set fid [open $filename r] 
    while {[gets $fid line] != -1} { 
     if {[string match "*$keyword*" $line]} {lappend lines $line} 
    } 
    close $fid 
    return $lines 
} 
set lines [select_lines file_test.file KEYWORD] 
Смежные вопросы