Tcl 如何使用exec运行bash一行程序

Tcl 如何使用exec运行bash一行程序,tcl,tk,Tcl,Tk,我过去使用过exec来运行bash命令和awk以及tcl 但这次我运行了一些复杂的1行程序来编辑变量名 set v "sccmp_hvt_c35_ff_0.99v_125c.lib" set corner_name [exec "echo $v | cut -d'.' --complement -f2- | cut -d'_' --complement -f-5 | tr '[a-z]' '[A-Z]'"] 这不起作用,并将“[a-z]”的错误作为无效命令抛出。 有什么方法可以帮助我通过tcl

我过去使用过
exec
来运行bash命令和
awk
以及tcl

但这次我运行了一些复杂的1行程序来编辑变量名

set v "sccmp_hvt_c35_ff_0.99v_125c.lib"
set corner_name [exec "echo $v | cut -d'.' --complement -f2- | cut -d'_' --complement -f-5 | tr '[a-z]' '[A-Z]'"]
这不起作用,并将“[a-z]”的
错误作为无效命令抛出。

有什么方法可以帮助我通过tcl运行这个bash脚本吗?

方括号必须转义:

# wrong
exec echo abc | tr [a-z] [A-Z]

# good
exec echo abc | tr \[a-z\] \[A-Z\]
在你的情况下,我会尝试:

set corner_name [exec "echo $v | cut -d'.' --complement -f2- | cut -d'_' --complement -f-5 | tr \[a-z\] \[A-Z\]"]
编辑

此外,我认为不需要引号:

set corner_name [exec echo $v | cut -d. --complement -f2- | cut -d_ --complement -f-5 | tr \[a-z\] \[A-Z\]]

方括号必须转义:

# wrong
exec echo abc | tr [a-z] [A-Z]

# good
exec echo abc | tr \[a-z\] \[A-Z\]
在你的情况下,我会尝试:

set corner_name [exec "echo $v | cut -d'.' --complement -f2- | cut -d'_' --complement -f-5 | tr \[a-z\] \[A-Z\]"]
编辑

此外,我认为不需要引号:

set corner_name [exec echo $v | cut -d. --complement -f2- | cut -d_ --complement -f-5 | tr \[a-z\] \[A-Z\]]

我想你是想这么做:

set corner_name [string toupper [join [lrange [split [lindex [split $v .] 0] _] 0 3] _]]
puts $corner_name   ;# => SCCMP_HVT_C35_FF
你也可以用它

string toupper [regexp -inline {^.*?(?:_.*?){3}(?=_)} $v]

我想你是想这么做:

set corner_name [string toupper [join [lrange [split [lindex [split $v .] 0] _] 0 3] _]]
puts $corner_name   ;# => SCCMP_HVT_C35_FF
你也可以用它

string toupper [regexp -inline {^.*?(?:_.*?){3}(?=_)} $v]

尝试过,但在执行时它说没有这样的文件或目录。我是否也需要在剪切后转义,因为它现在会为剪切抛出错误,并说:剪切:分隔符必须是单个字符。我认为您不需要
字符您是对的,删除”有助于我获得所需的o/p。感谢Unix shell中的Tcl等价于
{
..
}
。尝试过了,但执行时没有这样的文件或目录。我是否也需要在剪切后转义,因为它现在为剪切抛出了一个错误,即:剪切:分隔符必须是一个字符。我认为您不需要
'
字符您是对的,删除“”有助于我获得所需的o/p。感谢Unix shell中与
'
等价的Tcl是
{
..
}
。您希望的输出是什么?是“SCCMP\U HVT\U C35\U FF”吗?您想要的输出是什么?是“SCCMP_HVT_C35_FF”吗?是的,这是所需的输出,您是在tcl中本机完成的,而不是使用shell脚本。谢天谢地,这是您想要的输出,您是在tcl中本机完成的,而不是使用shell脚本。谢谢