Tcl:删除井号注释行

时间:2015-05-27 10:32:57

标签: tcl

为什么我不能删除英镑符号注释行?

#!/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个字符=>空格可以引导注释线。

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

您正在处理listlist的表示是一个简单的文字,因此您可以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 {

这也会删除完整行注释,但如果在英镑符号之前有一些空格或标签,则可能会留下空格或标签,因此请留空行。