为什么我不能删除英镑符号注释行?
#!/usr/bin/tclsh
set lines [list file1.bmp { # file2.bmp} file3.bmp ]
# Now we apply the substitution to get a subst-string that
# will perform the computational parts of the conversion.
set out [regsub -all -line {^\s*#.*$} $lines {}]
puts $out
输出:
file1.bmp { # file2.bmp} file3.bmp
-UPDATE -
预期产出:
file1.bmp {} file3.bmp
{}
表示空字符串。
事实上,这是我的第一步。我的最终目标是消除所有注释行和所有空行。上述问题仅将所有注释行更改为空行。例如,如果输入为:
set lines [list file1.bmp { # file2.bmp} {} file3.bmp ]
我希望我的最终结果是
file1.bmp file3.bmp
注意:Stackoverflow错误地在磅(#)符号之后和之后调暗,认为这些是注释。然而在TCL语法中,它不应该是注释。
@Tensibai: 我还想删除空行,因此我在'#'之前匹配任意数量的空格。 (因为删除所有后面的'#'后,它是一个空行)。事实上,在我的数据中,评论总是单独显示为一个完整的行。然而'#'符号可能不会出现在第1个字符=>空格可以引导注释线。
答案 0 :(得分:1)
编辑以在编辑后回答:
#!/usr/bin/tclsh
set lines [list file1.bmp { # file2.bmp } file3.bmp #test ]
puts $lines
# Now we apply the substitution to get a subst-string that
# will perform the computational parts of the conversion.
set out [lsearch -regexp -all -inline -not $lines {^\s*(#.*)?$}]
puts $out
输出:
file1.bmp file3.bmp
您正在处理list
,list
的表示是一个简单的文字,因此您可以regsub
,但它只是一行。
如果要检查此列表中的元素,则必须使用与列表相关的命令。
此处lsearch
将执行您所做的事情,检查每个项目以查看它们是否与正则表达式匹配,-not
告诉返回与-all -inline
不匹配的元素
旧答案:
为什么:因为你的正则表达式匹配任何英镑只有0或无限数量的空格。因此,它只匹配注释行而不是内联注释。
请查看http://regex101.com以测试正则表达式。
工作正则表达式将是:
#!/usr/bin/tclsh
set lines [list file1.bmp { # file2.bmp} file3.bmp ]
# Now we apply the substitution to get a subst-string that
# will perform the computational parts of the conversion.
set out [regsub -all -line {^(.*?)#.*$} $lines {\1}]
puts $out
正则表达式(完整详情here):
^
匹配行首(.*?)#
在#(非贪婪的运算符?限制匹配)之前匹配并捕获尽可能有限数量的字符.*$
匹配任何数量的字符,直到行尾我们用\1
替换,这是第一个捕获组(在这种情况下是唯一的捕获组)。
输出:
file1.bmp {
这也会删除完整行注释,但如果在英镑符号之前有一些空格或标签,则可能会留下空格或标签,因此请留空行。