我有一个Tcl变量,其中包含以下内容:
m_hscaclbmbmmer_v11_2
m_letmmcbterbox_v1_2
m_osbbbbcmd_v16_0 v_proc_ss_v1_0
m_rmgbbb2cycrcb_v17_4
m_nscalbbbcer_v8_2
m_smpte2mbbc022_m12_rx_v2_3
m_smpte2m02cm2_12_tx_v2_2
m_smpte20m2mcm2_56_rx_v5_4
m_smpte202m2_c56_tx_v4_0
m_smpbbbte_sdbbci_v3_0
m_smpte_uhdmsdic_v1_2
m_tmmmc_v6_4
m_tpmmmg_v17_1
m_vcresamcpler_v1_2
m_vid_mminc_axi4s_v14_1
m_voip_femcc_rx_v11_3
m_voip_fmbmecc_tx_v1_2
m_vscalebcr_v1_4
m_ycrcb2bncrgb_v7_4
mid_phy_cnmcbmbontroller_v2_2
mibmmbbo_v3_4
miterbcbmbi_v9_4
madc_wicbmbz_v3_4
mambmbuic_v12_2 mvxfftc_v9_4
姓氏mvxfftc_v9_4
需要更改为microsemi.com:ip:mvxfft:9.4
,同样需要对所有名称进行更改。我该怎么做?
答案 0 :(得分:1)
问题稍微不明确,但我假设您正在使用这样的每个名称(标记要提取的部分):
mvxfftc_v9_4
^^^^^^ ^ ^
并将其转换为(标记插入的部分):
microsemi.com:ip:mvxfft:9.4
^^^^^^ ^ ^
对regsub
来说并不太难,因为我们正在将格式良好的单词更改为格式良好的单词,我们可以直接将它作为字符串处理直接用于变量,而无需映射它在列表上明确地说:
set changed [regsub -all {\y(\w+)\w_v(\d+)_(\d+)\y} $original {microsemi.com:ip:\1:\2.\3}]
# \y is a beginning-or-end-of-word anchor
# \w means any alphanumeric-or-underscore
# \d means any digit
# \1, \2 and \3 are substituted by the parenthesised matches
您可以通过这种方式对映射的复杂性进行限制,但这可能就足够了。
答案 1 :(得分:0)
也许你可以尝试(假设你的名字列表在name
中):
foreach name $names {
puts microsemi.com:ip:[regsub {_v(\d)_(\d)$} $name {:\1.\2}]
}
这不是很漂亮,但它确实表达了你想要完成的事情。
如果你想要一个列表而不是打印输出,你可以使用它(Tcl 8.6或更高版本,留下结果result
):
set result [lmap name $names {
lindex microsemi.com:ip:[regsub {_v(\d)_(\d)$} $name {:\1.\2}]
}]
或者这个(大多数版本):
set result {}
foreach name $names {
lappend result microsemi.com:ip:[regsub {_v(\d)_(\d)$} $name {:\1.\2}]
}
文档:foreach,lappend,lindex,lmap,lmap替代,puts,regsub,{{ 3}}
关于正则表达式写作:
还有一些网站致力于各种编程语言的正则表达式:Google搜索应该可以为您提供帮助。