在Tcl列表元素中,引号后接“中”)&引用;而不是空间

在Tcl列表元素中,引号后接“中”)&引用;而不是空间,tcl,regsub,Tcl,Regsub,这个问题可能是问题的重复,但我面临的问题与答案无关。我尝试了人们在那里发布的代码,但我无法实现我想要的。 我的代码: 上面的代码不工作,但在我包含{} set line {H_Dev: Issue with DELETE funtion in OSPF OC (Input List is missing required key "identifier")} 它是这样工作的 H_Dev: Issue with DELETE funtion in OSPF OC Input List is m

这个问题可能是问题的重复,但我面临的问题与答案无关。我尝试了人们在那里发布的代码,但我无法实现我想要的。 我的代码:

上面的代码不工作,但在我包含{}

set line {H_Dev: Issue with DELETE funtion in OSPF OC (Input List is missing required key "identifier")} 
它是这样工作的

H_Dev: Issue
with DELETE
funtion in
OSPF OC
Input List
is missing
required key
identifier
但在我的脚本中,$行仅在列表中。如何获得这样的纯文本

H_Dev: Issue with DELETE funtion in OSPF OC Input List is missing required key identifier

问题在于这一行:

set line H_Dev: Issue with DELETE funtion in OSPF OC (Input List is missing required key "identifier") 
由于您没有引用任何内容,因此将许多参数传递给
set
(这会出错,因为它不接受那么多参数),或者除了
“标识符”)
看起来像是一个双引号的单词,只是因为关闭
后的
这就是错误的原因

通常的修复方法是对整个字符串加双引号(在任何内部双引号之前加反斜杠):

或者把所有的东西都放在支架上(这样做很容易):


要仅获取所需的单词,可以使用
string map
删除不需要的字符,
regsub-all
删除不需要的字符,或
regexp-all-inline
选择所需的单词

备选方案一:

set line [string map {{"} {} ( {} ) {}} $line]
备选方案二:

set line [regsub -all {[("")]} $line ""]
备选方案三:

set line [regexp -all -inline {[\w]+:?} $line]

我倾向于选择我想要的单词,而不是过滤我不想要的字符,因为这对于意外的输入就不那么令人惊讶了。其他人不同意我的观点。

问题在于这一行:

set line H_Dev: Issue with DELETE funtion in OSPF OC (Input List is missing required key "identifier") 
由于您没有引用任何内容,因此将许多参数传递给
set
(这会出错,因为它不接受那么多参数),或者除了
“标识符”)
看起来像是一个双引号的单词,只是因为关闭
后的
这就是错误的原因

通常的修复方法是对整个字符串加双引号(在任何内部双引号之前加反斜杠):

或者把所有的东西都放在支架上(这样做很容易):


要仅获取所需的单词,可以使用
string map
删除不需要的字符,
regsub-all
删除不需要的字符,或
regexp-all-inline
选择所需的单词

备选方案一:

set line [string map {{"} {} ( {} ) {}} $line]
备选方案二:

set line [regsub -all {[("")]} $line ""]
备选方案三:

set line [regexp -all -inline {[\w]+:?} $line]

我倾向于选择我想要的单词,而不是过滤我不想要的字符,因为这对于意外的输入就不那么令人惊讶了。其他人不同意我的观点。

如果您想使用“set”命令将字符串分配给变量,那么您的字符串周围需要大括号(或引号,在您的情况下,大括号不起作用,因为字符串中有引号)。如果没有大括号,则会向“set”命令传递太多参数。问题是:

foreach {name value} [string map {( { } ) {} } $line] {
  puts "$name $value"
}
这是一次遍历字符串两个单词,将它们分配给变量“name”和“value”,并在一行上打印每一对。如果只想打印整个字符串,请去掉foreach行并执行以下操作:

puts $line
如果您还试图去掉括号和括号(这是代码中的样子),您可以这样做:

puts [string map {( { } ) {} } $line]

如果要使用“set”命令将字符串赋给变量,则在字符串周围需要大括号(或引号,在您的情况下,大括号不起作用,因为字符串中有引号)。如果没有大括号,则会向“set”命令传递太多参数。问题是:

foreach {name value} [string map {( { } ) {} } $line] {
  puts "$name $value"
}
这是一次遍历字符串两个单词,将它们分配给变量“name”和“value”,并在一行上打印每一对。如果只想打印整个字符串,请去掉foreach行并执行以下操作:

puts $line
如果您还试图去掉括号和括号(这是代码中的样子),您可以这样做:

puts [string map {( { } ) {} } $line]