我有一句话:
{"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
由于元素中的"
字符,这看起来像一个Tcl列表,其中内括号。因此,我们需要做的就是对每个元素应用一个剥离命令(一个相当简单的string trim
); lmap
让这很容易:
set yourData {{"a/b"} {"c/d"} {"e/f"}}
set yourCleanData [lmap elem $yourData {
string trim $elem \"
}]
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