从字符串中删除双引号逗号

时间:2019-02-21 07:13:50

标签: tcl trim

我有这样一行:

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

2 个答案:

答案 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

struct::list flatten

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