Wie man unerwünschte charecters entfernen Split in tcl mit

stimmen
2

Hier ist ein Beispiel

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

Ich möchte entfernen {}in diesem.
Ich nahm alle oben genannten String - Schnittstelle Variable

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

aber es funktioniert nicht. Wie das zu entfernen , {}in meinem Beispiel?

Veröffentlicht am 11/06/2010 um 07:42
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
2

Was haben Sie dort sehen aus wie eine Liste TCL eher als einen String. So behandelt die Daten als Liste, die Sie so etwas wie dies können:

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

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

puts $res
Beantwortet am 11/06/2010 um 11:11
quelle vom benutzer

stimmen
0

Hier ist, was Sie tun können:

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 ""]

Und hier ist das Ergebnis:

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

Arpan

Beantwortet am 11/06/2010 um 15:20
quelle vom benutzer

stimmen
0

Ich stimme mit Jackson, dass Ihre Daten sehr viel erscheint eine Liste (strukturierte Daten) zu sein. Können Sie die Struktur der Daten identifizieren, was ist? Wenn Sie können, dann können Sie die Daten in der Liste nehmen und die Werte richtig interpretieren ... und die {} Stücke sind sehr wahrscheinlich Felder, die keinen Wert haben. Für (ein vereinfachtes) Beispiel:

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"
        }
    }
}

Offensichtlich sind die Daten und Code ist ein bisschen zerknirscht (Ich habe sehr einfachen Code zu halten, klar, was ich tat), aber die Idee sollte verständlich sein.

Alles, was gesagt wird, es „fühlt“ für mich wie Ihre Daten „falsch“ in irgendeiner Weise ... wie es eine fehlende geschweifte Klammer in dort ein paar Orte (wie FastEthernet0 / 0 und 0/1 sowohl Kinder des Protokolls sein sollten , etc.)

Beantwortet am 11/06/2010 um 17:19
quelle vom benutzer

stimmen
6

Ich vermute , dass Sie dies tun: beginnend mit einer Schnur und versuchen , es in Worte zu spalten, nur Tcl - splitBefehl wird eine Liste mit vielen leeren Werten produzieren:

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 splitSpalten auf einzelne Leerzeichen standardmäßig ( im Gegensatz zu awk oder Perl , die an aufeinanderfolgenden Leerzeichen Zeichen spalten).

Sie können einige Entscheidungen Ihnen das Leben leichter zu machen:

1) verwenden regexp alle „Wörter“ zu finden

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

2) das textutil Paket für einen Split-Befehl, wie Sie wirkt scheinen zu erwarten:

package require textutil
set fields [textutil::splitx $input]
Beantwortet am 11/06/2010 um 22:55
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more