如何在 TCL 中执行此 grep 命令?
grep '[A-Z][A-Z][A-Z]\-[0-9][0-9][0-9]' file1 > file2
答案1
tcl使用大括号作为引号而不是单引号。这会起作用:
grep {[A-Z][A-Z][A-Z]-[0-9][0-9][0-9]} file1 > file2
但请记住,如果没有匹配项,则会出现仍然报告错误,例如,
child process exited abnormally
while executing
"exec grep {[A-Z][A-Z][A-Z]-[0-9][0-9][0-9]} file1 > file2"
(file "./foo" line 4)
为了那, 这Tcl文档指出您应该将命令包装在一个catch
块中,例如,
set status 0
if {[catch {exec grep {[A-Z][A-Z][A-Z]-[0-9][0-9][0-9]} file1 > file2} results options]} {
set details [dict get $options -errorcode]
if {[lindex $details 0] eq "CHILDSTATUS"} {
set status [lindex $details 2]
} else {
puts "unexpected error $options $results"
set status 99
}
}
进一步阅读:
- tcl - 了解大括号的用法
其中一个答案说大括号类似于 shell 的单引号,双引号的作用类似于 shell 的双引号,但没有澄清后者的作用之内 tcl并且使用双引号会产生invalid command name "A-Z"
错误。
答案2
您尝试过仅使用吗exec
?
IE:
exec grep "[A-Z][A-Z][A-Z]\-[0-9][0-9][0-9]" file1 > file2