代码之家  ›  专栏  ›  技术社区  ›  DarkwingDuck

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

  •  2
  • DarkwingDuck  · 技术社区  · 16 年前

    我有一个ascii文件,其中有一行: 开始 后来在电话里说: 结束

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

    编辑:请参见 sed in Vista - how to delete all symbols between? 有关如何使用sed执行此操作的详细信息(cygwin已经使用sed)。

    编辑:我发现SED可以工作,但是当我将输出管道化到文件时,回车已经被删除。我怎么能留着这些?使用此sed正则表达式:

    /^GlobalSection(TeamFoundationVersionControl)=预解$/,/^EndGlobalSection$/{ /^全局节(TeamFoundationVersionControl)=预解决$/!{ /^结束全局节$/!丁 } }

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

    编辑:我现在为sed使用一些更简单的方法:

    /^全局分区(TeamFoundationVersionControl)=预解决方案$/,/^EndGlobalSection$/d

    但是换行仍然是个问题

    3 回复  |  直到 7 年前
        1
  •  1
  •   danieltalsky    16 年前

    另外,我现在使用的是一种脚本语言,它可以很好地与Ruby或Python之类的窗口一起执行这些任务。Ruby很容易在windows中安装,并且会产生像这个孩子的游戏这样的问题。

    这里有一个脚本,你可以使用如下: cutbegined.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更可读。

        2
  •  1
  •   j_random_hacker    16 年前

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

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

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

    如果您没有安装Perl,那么 ActivePerl .

        3
  •  0
  •   deadlydog    13 年前

    下面是如何使用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);