Как удалить ненужные персонажи, используя split в tcl - PullRequest
2 голосов
/ 11 июня 2010

Вот пример

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 ]

6 голосов
/ 12 июня 2010

Я подозреваю, что вы делаете это: начиная со строки и пытаясь разбить ее на слова, только команда 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) используйте regexp, чтобы найти все «слова»

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

2) используйте пакет textutil для команды split, которая действует так, как вы ожидаете:

package require textutil
set fields [textutil::splitx $input]
2 голосов
/ 11 июня 2010

То, что у вас там, похоже на список TCL, а не на строку. Таким образом, рассматривая данные как список, вы можете сделать что-то вроде этого:

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

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

puts $res
0 голосов
/ 11 июня 2010

Я согласен с Джексоном, что ваши данные очень похожи на список (структурированные данные). Можете ли вы определить структуру данных? Если вы можете, то вы можете взять данные из списка и правильно интерпретировать значения ... и части {} очень вероятны, которые не имеют значения. Для (упрощенного) примера:

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 должны быть оба дети протокола и пр.)

0 голосов
/ 11 июня 2010

Вот что вы могли бы сделать:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...