Windows命令来检测和删除文件中的文本

我有一个ascii文件,并在那里是行:开始和稍后的行:结束

我希望能够从窗口中的命令行调用中删除这两行和所有内容。 这需要完全自动化。

编辑:见Vista中的sed – 如何删除之间的所有符号? 有关如何使用sed来做到这一点(cygwin已经sed)的细节。

编辑:我发现SED可以工作,但是当我输出到一个文件,回车已被删除。 我怎样才能保持这些? 使用这个sed正则expression式:

/ ^ GlobalSection(TeamFoundationVersionControl)= preSolution $ /,/ ^ EndGlobalSection $ / {/ ^ GlobalSection(TeamFoundationVersionControl)= preSolution $ /!{/ ^ EndGlobalSection $ /!d}}

..开始部分是'GlobalSection(TeamFoundationVersionControl)= preSolution'和结束部分是'EndGlobalSection'。 我也想删除这些行。

编辑:我现在使用更简单的sed:

/ ^ GlobalSection(TeamFoundationVersionControl)= preSolution $ /,/ ^ EndGlobalSection $ / d

换行依然是一个问题

或者,我现在使用的是一种脚本语言,可以很好地与Ruby或Python等窗口一起玩这样的任务。 红宝石很容易安装在Windows中,使像这个孩子玩的问题。

这里有一个你可以使用的脚本: cutBeginEnd.rb myFileName.txt

sourcefile = File.open(ARGV[0]) # Get the string and do a multiline replace fileString = sourceFile.read() slicedString = fileString.gsub(/BEGIN.*END\n/m,"") #Overwrite the file sourcefile.pos = 0 sourcefile.print slicedString sourcefile.truncate(f.pos) 

这做得相当不错,允许很多灵活性,可能比sed更具可读性。

下面是一个1行的Perl命令,它可以完成你想要的操作(只需从命令提示符窗口输入):

 perl -i.bak -ne "print unless /^BEGIN\r?\n/ .. /^END\r?\n/" myfile.txt 

回车和换行将被正确保存。 myfile.txt的原始版本将被保存为myfile.txt.bak

如果你没有安装Perl,请获取ActivePerl 。

以下是如何使用C#正则表达式删除整个GlobalSection(TeamFoundationVersionControl)= preSolution部分:

 // Create a regex to match against an entire GlobalSection(TeamFoundationVersionControl) section so that it can be removed (including preceding and trailing whitespace). // The symbols *, +, and ? are greedy by default and will match everything until the LAST occurrence of EndGlobalSection, so we must use their non-greedy counterparts, *?, +?, and ??. // Example of string to match against: " GlobalSection(TeamFoundationVersionControl) ...... EndGlobalSection " Regex _regex = new Regex(@"(?i:\s*?GlobalSection\(TeamFoundationVersionControl\)(?:.|\n)*?EndGlobalSection\s*?)", RegexOptions.Compiled);