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