在批处理脚本文本流或文件中标识或删除双引号char

时间:2016-09-18 13:47:07

标签: windows batch-file text escaping double-quotes

我创建了用于从%N%读取file行的命令脚本。问题是当我处理文件的文本时,我无法从所有文本流中的任何位置删除"。非常需要"删除,因为如果文件的文本行有像"text"这样的子字符串而text有特殊的字符或更糟糕的脚本代码,那么脚本崩溃或工作方式不正确(包括脚本)控制由专门编写text)的程序员捕获 如果我无法从文本流中删除",那么我只想确定file(或它的第一个%N%行,包括空行)包含至少一个"字符 任何想法都值得赞赏,包括任何file预处理。但主要目标是脚本速度。

for /f "skip=2 delims=" %%a in ('find /v /n "" "file" 2^>nul') do set "v=%%a"&call :v&if not errorlevel 1 goto FURTHER1
goto FURTHER2
:v
for /f "delims=[]" %%a in ("%v%") do set "line%%a=%v:*]=%"&if %%a lss %N% (exit /b 1) else exit /b 0

2 个答案:

答案 0 :(得分:1)

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q39558311.txt"
SET "tempfilename1=%sourcedir%\q39558311#.txt"
>"%tempfilename1%" ECHO("
SET /a linefound=0
FOR /f "tokens=1 delims=:" %%a IN ('findstr /n /g:"%tempfilename1%" "%filename1%"') DO (
 IF %%a gtr 2 SET /a linefound=%%a&GOTO report
)
:report
ECHO quote found AT line %linefound%
DEL "%tempfilename1%"
GOTO :EOF

您需要更改sourcedirfilename1的设置以适合您的具体情况。

tempfile1可以是任何名称 - 它只是一个临时文件;为方便起见,我选择了这个特定名称。

我使用了一个名为q39558311.txt的文件,其中包含一些虚拟数据供我测试。

基本上,在单行* tempfile1上创建一个包含单引号的文件,然后使用带有findstr选项的/g:filename来读取要查找的目标字符串。当findstr找到该行时,会对其进行编号并输出line_number:line found。使用:作为分隔符,此行的标记1是行号。

我不明白为什么您在代码中使用了skip=number。您是否打算跳过测试目标文件的前两行?

IF %%a gtr 2测试找到的行号。如果它大于2,则设置变量linefound并终止for循环。

我选择将linefound初始化为零。如果在第2行中没有找到",它将保持为零。同样,你可以清除它然后它将被定义(第一行找到 - 引用 - 大于-2的值)并且没有找到未找到的定义。

答案 1 :(得分:0)

我只能识别",但不能删除。等待你的建议!

>nul 2>&1 findstr /m \" "file"
if not errorlevel 1 echo double quote found!