我不知道它是否真的可以这样做,但是我有一个文本文件,其中包含一些仅使用ascii回车符(CR)字符的行,并且不会使用换行符(LF)字符。
我的问题是我正在尝试使用FIND命令来搜索文件中的字符串,但是我不能让它返回任何带有CR的行(显然它会返回CR + LF行)
有什么方法可以使用本机批处理命令搜索这些行?
答案 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>