搜索文件内容以删除具有$ DEBUG字符的预编译指令之间的行。
搜索数据行的典型模式:
#IFDEF $DEBUG_MY_TEST
.... lines ...
#ENDIF
#IFDEF DEBUG_MY_issues for_sam
.... lines ...
#ENDIF
#IFDEF CMER for_max
.... lines ....
#ENDIF
此表达式测试有效:
if { [regexp -lineanchor -nocase -- {^[ \t]*#IFDEF[ \t]+[\$]?DEBUG.*} $oline_strpd ] == 1 } {
set remove_to_cust_endif $oline_strpd; # sanity check
continue;
}
我认为问题是在字符串变量模式中使用$
字符。
使用此字符串变量方法进行搜索无效? :
set RE_STRNG [format "\{^\[ \\t\]*#IFDEF\[ \\t\]+\[\\$\]?DEBUG.*\}"]
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
set remove_to_cust_endif $oline_strpd; # sanity check
continue;
}
在代码的前一行中,使用此字符串变量方法正在运行:
set RE_STRNG [format "\{^\[ \\t\]*#IFDEF\[ \\t\]+CMER\[ \\t\]+%s\}" $is_cmer_name ]; # insert name into the search pattern
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 && [llength $oline_strpd] == 3 } {
set print_to_cust_endif $oline_strpd; # sanity check
continue;
}
答案 0 :(得分:0)
这有效:
set RE_STRNG {^[ \t]*#IFDEF[ \t]+[\$]?DEBUG.*}
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
set remove_to_cust_endif $oline_strpd; # sanity check
continue;
}
或者,如果您想使用format
,您仍然可以保留大括号:
set RE_STRNG [format {^[ \t]*#IFDEF[ \t]+[\$]?DEBUG.*}]
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
set remove_to_cust_endif $oline_strpd; # sanity check
continue;
}
我不确定它为什么不起作用,但以下工作:
set RE_STRNG [format "^\[ \\t\]*#IFDEF\[ \\t\]+\[\\$\]?DEBUG.*"]
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
set remove_to_cust_endif $oline_strpd; # sanity check
continue;
}
我测试了一些更有趣的内容,如果你在文件的某个地方插入[format "\{^\[ \\t\]*#IFDEF\[ \\t\]+\[\\$\]?DEBUG.*\}"]
就行,并使用它:
set RE_STRNG [format "\{.*\}"]
if { [regexp -lineanchor -nocase -- $RE_STRNG $oline_strpd ] == 1 } {
set remove_to_cust_endif $oline_strpd; # sanity check
continue;
}
匹配的唯一一行就是你刚插入的那一行,这让我相信正则表达式试图匹配文本中的[format "{.*}"]
(格式)。所以我相信由于替换,Tcl在将它放入正则表达式之前执行命令format
,而没有它,它会在正则表达式中使用format命令插入所有内容。