如何使用TCL将以下列表拆分为4个元素
W.1.Agg-251 :: ethernet17 / 24 Z.1.Acc-2 :: ethernet17 / 1
我尝试如下,但中间的两个元素看起来是粘在一起的,
设置c [split $ c ::] {\ W.1.Agg-251 {} {ethernet17 / 24 Z.1.Acc-2} {} ethernet17 / 1}
更新
如果我按原样传递列表,下面提供的解决方案确实有效,但是当我将其作为变量列表传递给下面时,我再次看到中间元素粘在一起。
像这样:
set list2 [lindex $list 0]
O / P ==> W.1.Agg-251 :: ethernet17 / 24 Z.1.Acc-2 :: ethernet17 / 1
set list3 [split [string map {:: :} $list2] ":" ]
O / P ==> {W.1.Agg-251} {ethernet17 / 24 Z.1.Acc-2} ethernet17 / 1
答案 0 :(得分:1)
要拆分的第二个参数不是要拆分的字符串,而是可用于拆分的一组字符。请注意以下示例:
% split {a::b::c::d} ::
a {} b {} c {} d
% split {a::b::c::d} :
a {} b {} c {} d
你要做的似乎是拆分“::”和空格。你应该首先压缩::序列,然后分割如下:
% split [string map {:: :} {W.1.Agg-251::ethernet17/24 Z.1.Acc-2::ethernet17/1}] ": "
W.1.Agg-251 ethernet17/24 Z.1.Acc-2 ethernet17/1
答案 1 :(得分:0)
你说了4个元素,但我只看到3个元素(两个::对)。你确定24和Z之间的空格不应该是::而是吗?
答案 2 :(得分:0)
您需要做的就是将“::”替换为空格“”:
set list2 [string map {"::" " "} $list]
验证
foreach token $list2 { puts ">$token<" }
输出:
>W.1.Agg-251<
>ethernet17/24<
>Z.1.Acc-2<
>ethernet17/1<