什麼究竟是你執行了嗎?
當我輸入上述命令到tclsh
,它會顯示一個錯誤 -
% set test1 [list prefix_abc_3 abc_1 abc_2 AAA_0]
prefix_abc_3 abc_1 abc_2 AAA_0
% set test2 abc
abc
% regsub -all ${test2}_[1-9] [list] test1
invalid command name "1-9"
我不能確定你正在嘗試做的。您首先將test1
inisitalising作爲列表。然後將它作爲字符串將其傳遞給regsub。這是一件完全合法的事情,但可能表明你對某事感到困惑。您是否試圖通過將其應用四次來測試您的替換:prefix_abc_3
,abc_1
,abc_2
和AAA_0
中的每一個?你當然可以做你的方式,而是一種更自然的方式是做
foreach test $test1 {
regsub $pattern $test [list] testResult
puts stdout $testResult
}
再說,什麼是你想實現你的替代?它看起來好像你試圖用一個空字符串替換字符串abc
,即完全刪除它。通過[list]
作爲空字符串是完全有效的,但可能指示列表和字符串之間的混淆。
達到你想要的結果,所有你需要做的就是添加一個領先的空間,你的模式,通過一個空格作爲替換字符串和逃逸的方括號,即
regsub -all " ${test2}_\[-9\]" $test1 " " test1
但我懷疑這是一個虛構的例子,你真的想做一些稍微不同的事情。
編輯
爲了獲得一個只包含不準確的模式匹配列表項的列表,我建議
proc removeExactMatches {input} {
set result [list]; # Initialise the result list
foreach inputElement $input {
if {![regexp {^abc_[0-9]$} $inputElement]} {
lappend result $inputElement
}
}
return $result
}
set test1 [removeExactMatches [list prefix_abc_3 abc_1 abc_2 AAA_0]]
注:
我)我不根本不使用regsub。
II),雖然它的安全和合法的列表和字符串之間切換左右,這一切都需要時間,它掩蓋什麼,我tryng做的,所以我避免它儘可能。你似乎有一個字符串列表,你想刪除它們中的一些,所以這就是我在我建議的解決方案中使用的。 Tcl中的正則表達式命令處理字符串所以我傳遞它們的字符串。
iii)爲確保列表元素完全匹配,我使用^
和$
將模式錨定到匹配的字符串的開始和結尾。
iv)爲了防止解釋器識別正則表達式模式中的[1-9]並嘗試執行(不存在)命令1-9
,我將整個模式字符串括在大括號內。
V)對於較大的通用性,我可能想通過模式的PROC以及輸入列表(串),在這種情況下,我會做
proc removeExactMatches {inputPattern input} {
.
.
.
set pattern "^"
append pattern $inputPattern
append pattern "\$"
.
.
.
if {![regub $pattern $inputElement]} {
.
.
.
}
set test1 [removeExactMatches {abc_[1-9]} {prefix_abc_3 abc_1 abc_2 AAA_0}]
,以儘量減少數量必須逃脫的角色。 (實際上我可能不會使用proc
內的開始和結束錨點的引號 - 他們並不是真的需要,我是一個懶惰的打字員!)
看着你的原始問題,看起來你可能只想改變abc
模式的一部分,在這種情況下,您可能只想將其傳遞給proc
並附加_[0-9]
以及其中的錨點 - 不要忘記跳過方括號或使用大括號如果你走這條路。
在[1-9]之前使用反斜槓(產生\\ [1-9 \\]),因爲否則它將看到1-9作爲要執行的命令。 – Roalt