代码之家  ›  专栏  ›  技术社区  ›  Gert Gottschalk

TCL regsub replace last/in文件名

  •  0
  • Gert Gottschalk  · 技术社区  · 6 年前

    替换最后一个 / 在文件名中 : 我试着遵循代码。

    set x a/b/c
    regsub {.*(\/)\S+$} $x {:}
    

    意外的结果是 : .

    a/b:c

    示例:

    a -> a
    a/b -> a:b
    aa/b -> aa:b
    aa/bb/.../dd/e -> aa/bb/.../dd:e
    

    1 回复  |  直到 6 年前
        1
  •  3
  •   glenn jackman    6 年前

    用正则表达式,你可以说

    set new [regsub {/([^/]+)$} $x {:\1}]       ;# ==> a/b:c
    
    foreach d {a a/b aa/b aa/bb/.../dd/e} {puts "$d => [regsub {/([^/]+)$} $d {:\1}]"}
    # a => a
    # a/b => a:b
    # aa/b => aa:b
    # aa/bb/.../dd/e => aa/bb/.../dd:e
    

    file command

    set new [file dirname $x]:[file tail $x]    ;# ==> a/b:c
    

    第二个选项的问题是,如果字符串不包含斜杠,则 a .:a 所以你需要这样做:

    foreach d {a a/b aa/b aa/bb/.../dd/e} {
        set new [expr {[string first / $d] == -1 ? $d : "[file dirname $d]:[file tail $d]"}]
        puts "$d -> $new"
    }