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

时间:2018-04-17 06:29:11

标签: tcl regsub

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

extern type *jagged[];

...

type *jagged[] = { jagged_row_0, jagged_row_1 };

...

printf("jagged[1][0] = %d\n", jagged[1][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")} 

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

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

2 个答案:

答案 0 :(得分: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选择想要的字词。< / p>

选项一:

set line [string map {{"} {} ( {} ) {}} $line]

选项二:

set line [regsub -all {[("")]} $line ""]

选项三:

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

我倾向于选择我想要的单词,而不是过滤我不想要的字符,因为对于意外的输入而言,这不太令人惊讶。其他人不同意我的看法。

答案 1 :(得分:0)

你是正确的,你需要使用大括号(或引号,因为你的字符串中有引号而在你的情况下效果不好),如果你想将它分配给带有&#34的变量;设置&#34;命令。如果你没有大括号,那么这会给&#34; set&#34;传递太多的参数。命令。问题是:

flyway.setTargetAsString("1.2.3");

这一次是通过你的字符串两个单词,将它们分配给变量&#34; name&#34;和&#34;价值&#34;并在一行上打印每一对。如果您只想打印整个字符串,请删除foreach行并执行此操作:

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

如果您还试图摆脱parens和braces(从代码中看起来像这样),您可以这样做:

puts $line