2

我有一个 ascii 文件,其中某处是行:BEGIN,稍后在行:END

我希望能够从 Windows 中的命令行调用中删除这两行以及介于两者之间的所有内容。这需要完全自动化。

编辑:请参阅Vista 中的 sed - 如何删除之间的所有符号?有关如何使用 sed 执行此操作的详细信息(cygwin 已 sed)。

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

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

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

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

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

换行仍然是一个问题

4

3 回答 3

1

这是一个 1 行 Perl 命令,它可以执行您想要的操作(只需从命令提示符窗口中键入它):

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

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

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

于 2009-01-09T16:56:29.490 回答
1

或者,我这些天使用的是一种脚本语言,它可以很好地与 Ruby 或 Python 等 Windows 一起完成此类任务。Ruby 很容易在 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 更具可读性。

于 2009-01-09T01:04:54.223 回答
0

以下是使用 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);
于 2011-09-30T17:08:02.687 回答