Tcl-запрос для сопоставления строковых шаблонов

У меня есть переменная 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

Решение

Проблема немного недооценена, но я предполагаю, что вы берете каждое имя следующим образом (отмечая части, которые будут извлечены):

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

Другие решения

Может быть, вы могли бы попробовать (если ваш список имен находится в 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}]
}

Документация: для каждого, lappend, LINDEX, Lmap, Lmap замена, путы, regsub, задавать

При написании регулярных выражений:

Есть также несколько сайтов, посвященных регулярным выражениям для различных языков программирования: поиск Google должен помочь вам.

0

По вопросам рекламы [email protected]