在 Tcl 列表中元素中的引号后跟 ")" 而不是空格

  • 本文关键字:空格 列表 Tcl 元素 tcl regsub
  • 更新时间 :
  • 英文 :


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

set line H_Dev: Issue with DELETE funtion in OSPF OC (Input List is missing required key "identifier") 
foreach {name value} [string map {( { } ) {} } $line] {
puts "$name $value"
}

上面的代码不起作用,但在我包含 { } 之后

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

但是在我的脚本中,$line仅在列表中。 如何获得这样的纯文本

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(这将出错,因为它不需要那么多参数),或者除了"identifier")看起来像是一个双引号的单词,除非它不是因为结束"后的),这就是错误的原因。

通常的解决方法是将整个字符串用双引号括起来(在任何内部双引号之前使用反斜杠):

set line "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")}

要仅获取所需的单词,您可以使用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]

最新更新