TCL изменить или удалить точную комбинацию символов из строки - PullRequest
0 голосов
/ 17 апреля 2019

При удалении файла я пытаюсь переименовать все файлы по порядковому номеру переменной.

У меня есть список файлов.Каждый из них назван в шестнадцатеричном и увеличен в зависимости от количества файлов в папке;когда создаются новый файл в этой папке

312d416e64207768657265206172652077652e2e20f09f8e88; # 1-файл - первый файл 332df09f8eb220556e64657220436f6e737472756374696f6e20f09f8eb2;. # 2-файл второго файл 332df09f8cb22043686e6167654c6f6720f09f8cb2; # 3-файл третий файл

1007 *

Я пытаюсь удалить первые четыре или комбинацию: 3x2d из каждого из этих файлов, а затем переименовать их в правильной последовательности

Мой код выглядит следующим образом:

set symbol [ixc::2Hex "-"] ;# 2d
set contents [glob -directory $dir *]
append sorted [lsort -dictionary $contents]

foreach item $sorted {
incr baseCount
set ze [file tail $item]

set hexCount [ixc::2Hex "$baseCount"] ;#convert ascii to hex
set hexZe "[string trim $ze "$hexCount$symbol"]" ;#trim the hexcount and delmiter from the file name
#set hexZe [regsub "$hexCount$symbol" $ze ""] ;#Alternative way of removing characters but buggy

puts "rename >> $item to $hexCount$symbol$hexZe" 
puts "----"

# catch the error if the "cannot rename same file" 
# this occurs when the file deletes 
# then rename tries to rename the same file as the same file

if { [catch {file rename $item $dir/$hexCount$symbol$hexZe} error] } {
continue
} else {
set fexist "$item"

#rename the file as the hexValue based off the counted ascii value 
#include the symbol and file name
#if the file does not exist such as the deleted file then skip

if { $fexist eq 1} { 
file rename $item $dir/$hexCount$symbol$hexZe   
} else { 
continue
}

Это работает точно так же, как и работает, и это именно тот результат, который я хочу

Однако он выполняет обрезку любого числа «2»

332df09f8eb220556e64657220436f6e737472756374696f6e20f09f8eb 2

Это приводит к нарушению гексагона, если вы должны были декодировать его обратно в ascii.

Используя regsub.Это работает, но дает забавные результаты.

set hexZe [regsub "$hexCount$symbol" $ze ""]

, что приводит к чему-то вроде:

372d382d f09f8cb22043686e6167654c6f6720f09f8cb2; # результат: 7-8-filename

Я предполагаю, что это потому, что я удаляю строку «3x2d» из строки при каждом цикле цикла.

tl; dr: хочу удалить «312d» из имени файлаи затем переименуйте файл с правильным инкрементным номером на основе счетчика каталога, разделенного символом "-"

cheers

1 Ответ

0 голосов
/ 17 апреля 2019

Команда string trim обрабатывает свой второй аргумент как набор символов для удаления и продолжает удалять их из обоих концов строки, пока не останется ни одного. Чтобы просто удалить с левого конца строки, есть string trimleft, но в этом случае вам лучше использовать либо:

# Save a copy of the string to remove in a variable for convenience
set pattern $hexCount$symbol

# How to do an exact prefix match
if {[string equal -length [string length $pattern] $pattern $ze]} {
    set hexZe [string range $ze [string length $pattern] end]
} else {
    # If it didn't match, fall back
    set hexZe $ze
}

или

# NOTICE THE ANCHOR! Only want to do this *at the start of the string*
set hexZe [regsub "^$hexCount$symbol" $ze ""]

Будьте очень осторожно при построении регулярных выражений. Хотя с шестнадцатеричными символами у вас все в порядке, легко попасть в рассол, если в компонентах шаблона есть метасимволы RE.


Для ясности, вероятно, лучше создать вспомогательную процедуру.

proc RemovePrefix {string prefix} {
    set length [string length  $prefix]
    if {[string equal  -length $length  $prefix $string]} {
        return [string range  $string  $length end]
    }
    return $prefix
}

set hexZe [RemovePrefix $ze $hexCount$symbol]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...