如何在使用CR但不使用LF的文本文件上使用FIND命令?

时间:2012-03-21 00:05:14

标签: batch-file

我不知道它是否真的可以这样做,但是我有一个文本文件,其中包含一些仅使用ascii回车符(CR)字符的行,并且不会使用换行符(LF)字符。

我的问题是我正在尝试使用FIND命令来搜索文件中的字符串,但是我不能让它返回任何带有CR的行(显然它会返回CR + LF行)

有什么方法可以使用本机批处理命令搜索这些行?

1 个答案:

答案 0 :(得分:2)

我已经详尽地测试了FINDSTR,我知道如果它只有<CR>而没有<LF>,它会将整个文件视为一行。

我没有使用FIND进行相同级别的测试,但我怀疑它会遇到同样的问题。但我现在不能肯定地说。


修改1

我已经确认(无论如何在Vista上),FIND会在<LF>之后严格地断行,无论是否有<CR><CR>字符只被视为另一个字符。

搜索其中嵌入了<CR>的行时,您应该没有任何问题。问题是输出在屏幕上的显示方式。此外,多条逻辑行将被视为一行(那些“以[{1}}结尾”)。

我使用以下结构创建了一个test.txt文件

<CR>

然后使用FIND反对它

1<CR><LF>
2<CR><LF>
3<CR>4<CR>5<CR><LF>
6<CR><LF>
7<CR><LF>

搜索3和4时输出看起来很奇怪,但它实际上是正确的。那是因为3,4和5都在同一条线上。 FIND打印出整行,但回车导致3被4覆盖,4被5覆盖。如果我做FIND "2" <test.txt -> 2 FIND "3" <test.txt -> 5 FIND "4" <test.txt -> 5 FIND "5" <test.txt -> 5 FIND "6" <test.txt -> 6 则更明显 - 它产生一个长度为7的文件字节。

如果使用FINDSTR,您将获得基本相同的结果。

你不能强迫FIND(或FINDSTR)在单独FIND "3" <test.txt >out.txt处打破行。但您可以使用以下简单的混合脚本对文件进行预处理,以将单独的<CR>字符转换为Windows标准行终止符。该脚本将要转换的文件名称作为第一个也是唯一的参数。

转换的内容是使用JScript完成的,其余部分是批处理的。使用混合动力可能很愚蠢 - 整个过程可以用JScript(或VBScript)完成,但混合动力很有趣。您可以根据需要轻松添加其他批处理命令。例如,您可以在MOVE之后但在EXIT / B之前添加FIND命令。

警告 - 脚本覆盖原始文本文件。如果希望修改后的版本是单独的文件,请删除MOVE命令。

<CR>

编辑2

我刚刚意识到,如果我稍微修改上面的脚本,那么搜索@if (@x)==(@y) @end /* harmless valid code for both batch and Jscript ::********* Batch Part ************************************************** :: This batch script calls the JScript below to normalize the end-of-line :: for the contents of the file name passed in as parameter 1. :: It redirects JScript to read its input from the file, and writes the :: output to a new file. The batch script than moves the new file to :: replace the original. :: :: You could put your FIND command after the MOVE and before the EXIT /B. :: @echo off <%1 cscript //e:jscript /nologo "%~f0" >"%~1.new" move "%~1.new" "%~1" >nul exit /b *********** JScript Part ************************************** * This little script reads stdin, normalizes the end-of-line, * and writes the result to stdout * * <CR><LF> -> no change * <LF> without preceding <CR> -> <CR><LF> * <CR> without following <LF> -> <CR><LF> */ while (!WScript.StdIn.AtEndOfStream) { WScript.StdOut.WriteLine(WScript.StdIn.ReadLine().replace( /\r/g, "\r\n" ) ); } 终止的“行”是完全非破坏性的方法。除了进行必要的修改外,我还删除了评论。

该脚本现在有两个参数:“searchString”,“fileName”

<CR>