我有这样一行:
{"a/b"} {"c/d"} {"e/f"}
我想要输出为:
a/b c/d e/f
基本上,我想从现有行中删除所有的“和{}。
我应该如何在TCL中做到这一点?
我尝试使用string trim
,但没有帮助。
set z {{"a/b"} {"c/d"} {"e/f"}}
set trimmed_z [string trim $z "\"\"\}\{"]
给出
a/b"} {"c/d"} {"e/f
答案 0 :(得分:2)
这看起来像一个Tcl列表,其中的内括号是由于元素中的"
字符所致。因此,我们要做的就是对每个元素应用一个剥离命令(一个相当简单的string trim
)。 lmap
使这个过程变得简单:
set yourData {{"a/b"} {"c/d"} {"e/f"}}
set yourCleanData [lmap elem $yourData {
string trim $elem \"
}]
答案 1 :(得分:1)
string trim
只会删除字符串末端的字符,即仅在开头和结尾处。您可以使用string map
:
set z {{"a/b"} {"c/d"} {"e/f"}}
set clean_z [string map {\" "" \{ "" \} ""} $z]
# a/b c/d e/f
否则,由于该行看起来像Tcl列表,因此您可以使用lmap
(Tcl 8.6+)来获取“最内层
子列表的元素”:
set clean_z [lmap x $z {set x [lindex $x 0]}]
# a/b c/d e/f
还有其他方法可以做到这一点;也许是一个循环和string trim
(这里我们只需要删除引号,因为这里的括号似乎起了引号的作用):
set z {{"a/b"} {"c/d"} {"e/f"}}
set cleaned_z ""
foreach n $z {
lappend cleaned_z [string trim $n \"]
}
puts $cleaned_z
# a/b c/d e/f
package require struct
set z {{"a/b"} {"c/d"} {"e/f"}}
set cleaned_z [struct::list flatten $z]
# a/b c/d e/f
或者,如果您喜欢使用regsub
来一些正则表达式:
set z {{"a/b"} {"c/d"} {"e/f"}}
# I'm only escaping the quote so the syntax highlighting doesn't break, but it's not
# necessary
set cleaned_z [regsub -all {[\"{}]} $z ""]
# a/b c/d e/f