Вызов grep с шаблоном с несколькими переменными - PullRequest
0 голосов
/ 26 января 2020

как я могу использовать несколько шаблонов с grep в tcl?

set finish [exec bash -c "cat /home/new.txt |grep \"$day\|$yesterday\" > /home/new_tmp.txt"]

, он работает в консоли bash

day=26.01.2020
yesterday=26.01.2020
cat /home/new.txt |grep "$day\|$yesterday"

, но со сценарием Tcl файл пуст.

Ответы [ 2 ]

1 голос
/ 27 января 2020

Общая подсказка grep. Поскольку вы ищете несколько фиксированных строк, а не регулярных выражений, вы можете grep сказать, что это более эффективный подход (и исправить проблему, связанную с . как метасимвол, а не точное совпадение):

grep -F -e "$day" -e "$yesterday" /home/new.txt > /home/new_tmp.txt

Или просто сделать все это в чистом tcl вместо того, чтобы задействовать оболочку?

set infile [open /home/new.txt r]
set outfile [open /home/new_tmp.txt w]
while {[gets $infile line] >= 0} {
    if {[string first $day $line] >= 0 || [string first $yesterday $line] >= 0} {
        puts $outfile $line
    }
}
close $infile
close $outfile
1 голос
/ 26 января 2020

Первое испытание будет:

set from /home/new.txt
set to /home/new_tmp.txt

set day 26.01.2020
set yesterday 26.01.2020
# Did you mean these two to be the same?

catch {exec grep "$day|$yesterday" <$from >$to}
# Because grep returns non-zero if it doesn't find anything, which exec converts to an error

На самом деле вам не нужен внешний cat очень часто, ни в Tcl, ни в Bash.

Имейте в виду, что grep соответствует . с любым символом.

...