g/re/pwhich was a global {regular expression} print command.Grep reads through one or more input streams (stdin or files), searching for a string of text which represents some for of a regular expression, and, depending on options provided, may produce the matching lines of input.
RS wrote this tiny, and feature-poor, emulation for use on PocketPC (but it should run elsewhere too):
proc grep {re args} {
set files [eval glob -types f $args]
foreach file $files {
set fp [open $file]
while {[gets $fp line] >= 0} {
if [regexp -- $re $line] {
if {[llength $files] > 1} {puts -nonewline $file:}
puts $line
}
}
close $fp
}
}# Test: catch {console show}
puts "Result:\n[grep "require" "*.tcl"]"Here's another version - I wrote this out of desperation because the real grep -f ate up all my memory, and then busted, under Cygwin (remove the leading blank in the # line for an executable script):
#!/usr/bin/env tclsh
proc main argv {
set usage {usage: grep-f.tcl refile ?file...? > outdata}
if {[llength $argv]<1} {puts $usage; exit}
set fp [open [lindex $argv 0]]
set REset [split [string trim [read $fp]] \n]
close $fp
if {[llength $argv] == 1} {
grep-f $REset stdin
} else {
foreach file [lrange $argv 1 end] {
set fp [open $file]
grep-f $REset $fp
close $fp
}
}
}
proc grep-f {REset fp} {
while {[gets $fp line] >= 0} {
foreach RE $REset {
if {[regexp $RE $line]} {
puts $line
break
}
}
}
}
main $argvSee also:
