在第一次出现给定字符串之后/之前删除所有内容

时间:2015-04-29 09:32:57

标签: string batch-file search

我正在开发一个小工具,用于在第一次出现给定分隔符后将文件拆分为2,这样从单个输入文件中,您将获得2个较小的输出文件。

例如,假设您有输入文件内容:

Alpha
Bravo Charlie
Charlie Echo

我使用的分隔符是Charlie,我怎么能得到一对输出文件,如:

Alpha
Bravo

<blank line>
Charlie Echo

我目前正在寻找第一次出现的分隔符字符串,然后在原始文本上执行两次子字符串,在分割文本之前使用分隔符字符串位置,然后将其保存到输出中。然而,虽然我已经成功地找到了如何做子串,但我没有找到关于strpos类似函数的任何成功。

那么,我该怎么做才能从文本/文件路径的输入块获得类似结果的strpos,或者是否有另一种(更好的?)方法来做我想做的事情?

N.B。我无法使用除Windows Batch Script之外的任何内容,因此,虽然PHP,或Sed,甚至Java,但它不是一个选项

2 个答案:

答案 0 :(得分:2)

这是我的解决方案。您可以在_outfile1_outfile2变量中配置输出文件,也可以在_split中配置拆分令牌。输入文件input.txt会假定您在问题中说明的内容。

@ECHO OFF
SETLOCAL EnableDelayedExpansion

SET _outfile1=output1.txt
SET _outfile2=output2.txt
SET _split=Charlie

SET OF=!_outfile1!
FOR /F "tokens=*" %%A IN ( input.txt ) DO (
    SET TEST=%%A
    IF "!OF!"=="!_outfile1!" (
        IF "!TEST:%_split%=!"=="%%A" (
            ECHO %%A >> !OF!
        ) ELSE (
            ECHO !TEST:%_split%=! >> !OF!
            SET OF=!_outfile2!
            ECHO. >> !OF!
        )
    ) ELSE (
        ECHO %%A >> !OF!
    )
)

答案 1 :(得分:2)

很多人都希望使用纯批处理来处理文本文件,实现强大的解决方案非常困难。它通常可以完成,但是在处理大型文件时最终结果可能会非常缓慢,并且它需要神秘的,通常是未记录的构造。

unix世界中有许多工具已移植到可用于解决此问题的窗口,例如sed和awk。最流行的文本处理实用程序使用正则表达式。

我建议您使用JREPL.BAT - a hybrid JScript/batch regular expression text processing utility。 JREPL.BAT是纯粹的脚本,可以在任何Windows机器上从XP开始本地运行,并且几乎与编译的文本实用程序一样快。完整的文档嵌入在脚本中。

解决此特定问题需要一个简单的命令行单行:

jrepl "([\s\S]*?)Charlie([\s\S]*)" "stdout.Write($2);$1" /m /j /f input.txt /o output1.txt >output2.txt

如果在批处理脚本中使用该命令,则应使用CALL JREPL。

工作原理

单个JREPL调用可以方便地写入stdout和文件。

  • /f input.txt指定输入文件
  • /o output1.txt指定应将正常输出写入第一个输出文件
  • >output2.txt将stdout重定向到第二个输出文件
  • /j将替换字符串视为JScript表达式
  • /m(多行模式)将整个输入文件视为单个字符串,允许跨多行搜索。
  • 第一个参数是搜索字符串
  • 第二个参数是替换字符串(复合JScript表达式)。第一个表达式将第二个捕获的字符串写入stdout。第二个(最后一个)表达式是第一个捕获的字符串,它取代了搜索字符串并写入正常输出(在本例中是第一个输出文件)。

如果您还没有理解正则表达式,我强烈建议您花点时间研究它们。网上有很多教程,它们非常强大。我还建议学习JREPL文档,阅读整篇JREPL DosTips文章。