我有一个文件svn_log.txt
,其中包含以下数据:
:SUMMARY: This module is test created
:TIME: the current time is not listed
我正在使用tcl和regex从此文件中提取摘要。
set svn_logs svn_logs.txt
set fp [open $svn_logs r]
set lines [split [read -nonewline $fp] "\n"]
close $fp
foreach line $lines {
if {[regexp -nocase {^\s*(:SUMMARY)\s*:\s*(.*)$} $line match tag value]} {
set [string tolower $tag] $value
}
}
puts $value
直到摘要只有一行才能正常工作。但有些情况下摘要有要点:
:SUMMARY: Following changes needs to be added
1. this one
2. this one too
:TIME:
在这种情况下,它不会提取除第一行以外的任何内容。我很难尝试修改上面的正则表达式命令,以便在:SUMMARY
和:TIME
之间进行任何操作。正则表达式的新手。任何人都可以提供任何意见吗?
文件的原始内容 - >
------------------------------------------------------------------------
r743 | aaddh | 2014-04-01 12:33:42 -0500 (Tue, 01 Apr 2014) | 8 lines
:SUMMARY: Modified file to add following changes:
1.Loop to avoid .
2.Change directory
3.The batch file
:TIME: Invalid
:Test:
:Comments:
答案 0 :(得分:2)
如果您真的想使用正则表达式,则必须使用不同的方法。您将不得不一次阅读整个文件并使用正则表达式:
set svn_logs svn_logs.txt
set fp [open $svn_logs r]
set lines [read -nonewline $fp]
close $fp
regexp -nocase -lineanchor -- {^\s*(:SUMMARY)\s*:\s*(.*?):TIME:$} $lines match tag value
puts $value
输入:
:SUMMARY: Following changes needs to be added
1. this one
2. this one too
:TIME:
你得到:
Following changes needs to be added
1. this one
2. this one too
-lineanchor
标记使^
匹配所有行的开头,$
匹配所有行的结尾。 --
只是确保没有额外的标志。
注意:在捕获的组的末尾有一个延迟的换行符,您可以根据需要修剪它。
答案 1 :(得分:1)
正则表达式解决方案非常紧凑。如果您正在阅读文件的行,您可以这样做:
set fh [open file r]
set insumm false
while {[gets $fh line] != -1} {
switch -regex -- $line {
{^:SUMMARY:} {set insumm true; set summary [string range $line 10 end]}
{^:\w+:} break
default {if {$insumm} {append summary \n $line}}
}
}
close $fh
答案 2 :(得分:-1)
您可以尝试以下内容:[^:SUMMARY:](.*)[^:TIME:]