如何使用tcl中的split删除不需要的字符

时间:2010-06-11 06:42:50

标签: tcl

这是一个例子

Interface {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} IP-Address {} {} {} {} {} OK? Method Status {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {Protocol
FastEthernet0/0} {} {} {} {} {} {} {} {} {} {} {} unassigned {} {} {} {} {} YES unset {} administratively down down {} {} {} {
FastEthernet0/1} {} {} {} {} {} {} {} {} {} {} {} unassigned {} {} {} {} {} YES unset {} administratively down down

我想在此删除{} 我假设所有上面的字符串接口变量

set interface [string trimright [string trimleft $interface "{}"] "{}"]

但它不起作用。如何删除我的示例中的{}

4 个答案:

答案 0 :(得分:6)

我怀疑你是这么做的:从一个字符串开始并尝试将其拆分为单词,只有Tcl的split命令生成一个包含大量空值的列表:

set input "Interface                  IP-Address      OK? Method Status                ProtocolFastEthernet0/0            unassigned      YES unset  administratively down down    FastEthernet0/1            unassigned      YES unset  administratively down down"
set fields [split $input]  ;# ==> Interface {} {} {} ...

默认情况下,Tcl的split在单个空白字符上进行拆分(与在连续的空白字符上拆分的awk或perl不同)。

您可以选择一些让您的生活更轻松的选择:

1)使用正则表达式查找所有“单词”

set fields [regexp -inline -all {\S+} $input] 

2)使用textutil包进行拆分命令,其行为与您期望的一样:

package require textutil
set fields [textutil::splitx $input]

答案 1 :(得分:2)

你在那里看起来像一个TCL列表而不是字符串。因此,将数据视为列表,您可以这样:

set data [list a b {} {} e f {} {} g {}]
puts $data

set res {}
foreach ele $data {
    if { $ele != {}} {lappend res $ele}
}

puts $res

答案 2 :(得分:0)

以下是您可以做的事情:

set y "Interface {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} IP-Address {} {} {} {} {} OK? Method Status {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {Protocol FastEthernet0/0} {} {} {} {} {} {} {} {} {} {} {} unassigned {} {} {} {} {} YES unset {} administratively down down {} {} {} {FastEthernet0/1} {} {} {} {} {} {} {} {} {} {} {} unassigned {} {} {} {} {} YES unset {} administratively down down"

set y [regsub -all ({}\ )+ $y ""]

这是结果:

Interface IP-Address OK? Method Status {Protocol FastEthernet0/0} unassigned YES unset administratively down down {FastEthernet0/1} unassigned YES unset administratively down down

Arpan

答案 3 :(得分:0)

我同意杰克逊的看法,你的数据似乎是一个列表(结构化数据)。你能确定数据的结构是什么吗?如果可以,那么您可以获取列表中的数据并正确解释值...而且{}段很可能是没有值的字段。对于(简化)示例:

set data {
    Person Steve Smith employee
    Position employee Employee 40
}

while {[llength $data] > 0} {
    set type [lindex $data 0]
    set data [lrange $data 1 end]
    switch -exact -- $type {
        Person {
            set first_name [lindex $data 0]
            set last_name [lindex $data 1]
            set position_shortname [lindex $data 2]
            set data [lrange $data 3 end]
        }
        Position {
            set shortname [lindex $data 0]
            set hourperweek [lindex $data 1]
            set data [lrange $data 2 end]
        }
        default {
            error "Unknown data type $type"
        }
    }
}

显然,数据和代码有点懊悔(我使用非常简单的代码来明确我正在做的事情),但这个想法应该是可以理解的。

所有这一切,对我来说“感觉”就像你的数据在某种程度上是“错误的”...就像在那里有一些缺少的大括号(比如FastEthernet0 / 0和0/1都应该是议定书的子女等)