0

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

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
4

2 回答 2

2

问题是这一行:

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]

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

于 2018-04-17T06:42:22.137 回答
0

如果你想用“set”命令将它分配给一个变量,你需要在你的字符串周围加上大括号(或引号,因为你在字符串中有引号)你是正确的。如果您没有大括号,那么这会将太多参数传递给“set”命令。问题是这样的:

foreach {name value} [string map {( { } ) {} } $line] {
  puts "$name $value"
}

这是一次遍历您的字符串两个单词,将它们分配给变量“name”和“value”并将每一对打印在一行上。如果您只想打印整个字符串,请去掉 foreach 行,然后执行以下操作:

puts $line

如果您还试图摆脱括号和大括号(这是您的代码中的样子),您可以这样做:

puts [string map {( { } ) {} } $line]
于 2018-04-19T16:03:09.917 回答