List 使用正则表达式或字符串匹配从列表中删除具有点扩展名的元素
我是Tcl的新手。我有这样一份清单:List 使用正则表达式或字符串匹配从列表中删除具有点扩展名的元素,list,tcl,regsub,List,Tcl,Regsub,我是Tcl的新手。我有这样一份清单: set list1 { dir1 fil.txt dir2 file.xls arun baskar.tcl perl.pl } 从该列表中,我只需要以下元素: dir1 dir2 阿伦 我尝试了regexp和lsearch,但没有成功 方法1: set idx [lsearch $mylist "."] set mylist [lreplace $mylist $idx $idx] 方法2: s
set list1 {
dir1
fil.txt
dir2
file.xls
arun
baskar.tcl
perl.pl
}
从该列表中,我只需要以下元素:
dir1dir2
阿伦 我尝试了
regexp
和lsearch
,但没有成功
方法1:
set idx [lsearch $mylist "."]
set mylist [lreplace $mylist $idx $idx]
方法2:
set b [regsub -all -line {\.} $mylist "" lines]
lsearch命令有许多选项,其中一些选项有助于简化此任务:
lsearch -all -inline -not $list1 *.*
如果你做得好,方法1就会起作用<默认情况下,code>lsearch返回单个结果,搜索条件接受全局模式。使用
将只查找等于
的元素。然后需要为lreplace
创建一个循环:
set idx [lsearch -all $list1 "*.*"]
foreach id [lsort -decreasing $idx] {
set list1 [lreplace $list1 $id $id]
}
按降序排序很重要,因为删除元素时元素的索引会发生变化(请注意,代码段中使用了错误的变量名)
如果使用正确的正则表达式,方法2也会起作用:
set b [regsub -all -line {.*\..*} $list1 ""]
但在这种情况下,您可能会希望调整结果<代码>*将匹配除换行符以外的任何字符
我可能会这样使用,这样可以避免更换:
set mylist [lsearch -all -inline -not $list1 "*.*"]
或者,使用
lmap
(或使用foreach
的显式循环)过滤列表中不可接受的元素:
另请参阅有关筛选列表的相关讨论,例如捕获的Thx(以前使用
字符串cat
时留下的)。看起来您可能正在从glob
生成列表,并且可能正在该列表中查找目录。您知道吗,您可以将选项-type d
(用于目录)传递到glob
,让它为您进行文件类型筛选?(相反,查找文件的类型f
)非常有用!我看过一些关于目录列表的文档,但我对自己的想法很满意。无论如何谢谢@DonalFellows
lmap el $list1 {if {[string first . $el] >= 0} {continue} else {set el}}