Batch file BAT文件替换两行中的字符串
我正在Windows中编写一个脚本,一个.BAT文件,以替换: 请注意,这里有一个ENTER,我的意思是字符串分为两行。现在看起来更复杂了:在两个双引号后面有两个空格,然后是“回车” 比如:(双引号)(双引号)(空格)(空格)(新行)(双引号)2014 我在这方面有问题。以下是脚本的外观:Batch file BAT文件替换两行中的字符串,batch-file,replace,Batch File,Replace,我正在Windows中编写一个脚本,一个.BAT文件,以替换: 请注意,这里有一个ENTER,我的意思是字符串分为两行。现在看起来更复杂了:在两个双引号后面有两个空格,然后是“回车” 比如:(双引号)(双引号)(空格)(空格)(新行)(双引号)2014 我在这方面有问题。以下是脚本的外观: @echo off setlocal enabledelayedexpansion set INTEXTFILE=FILE_IN_CSV.csv set OUTTEXTFILE=222.csv set SEA
@echo off
setlocal enabledelayedexpansion
set INTEXTFILE=FILE_IN_CSV.csv
set OUTTEXTFILE=222.csv
set SEARCHTEXT=^"^"^"2014
set REPLACETEXT=^"^"^"4
set OUTPUTLINE=
for /f "tokens=1,* delims=¶" %%A in ( '"type %INTEXTFILE%"') do (
SET string=%%A
SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
echo !modified! >> %OUTTEXTFILE%
)
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%
有什么想法吗
谢谢
编辑:添加源文本示例。请注意,每行末尾有3个(不是2个!)黑色空格
"2014091810000076";"Question about folder sizes";"2014-09-18 12:10:20";"2014-09-25 17:33:15";"Resolt Sistemes";"jbgsfnam";"Sistemes::Altres";"STFD";"peticions";""
"2014091910000109";"Error opening word files with office 2013";"2014-09-19 09:50:07";"2014-09-25 14:27:59";"Resolt TRO";"yerttom";"Qualitat::Altres";"STFD";"peticions";""
我只需要在每行的开头删除20,而不是中间行中的其他20个。
你的方法不能正常工作。for
始终逐行处理文本。因此,不可能将2行作为字符串放入环境变量并修改此字符串for
始终将其解释为独立于指定内容的分隔符字符“\s+”2014
用作搜索字符串,并将其用作替换字符串”4
将导致所需的修改
还有一些控制台应用程序是为替换文件中的字符串而编写的。看看
但是,使用以下代码可以仅使用标准命令搜索文件中的“”\r\n“2014
,并将其替换为”4
@echo off
setlocal EnableDelayedExpansion
set "INTEXTFILE=FILE_IN_CSV.csv"
if not exist "%INTEXTFILE%" goto EndBatch
set "OUTTEXTFILE=%TEMP%\csv_replace.tmp"
if exist "%OUTTEXTFILE%" del "%OUTTEXTFILE%"
set "FirstLine="
set "EndFirstLine="" "
set "BeginSecondLine="2014"
for /f "usebackq delims=" %%A in ("%INTEXTFILE%") do (
set "Line=%%A"
if not "!FirstLine!"=="" (
if "!Line:~0,5!"=="!BeginSecondLine!" (
set "FirstLine=!FirstLine!"!Line:~4!"
echo !FirstLine!>>"%OUTTEXTFILE%"
set "Line="
) else (
echo !FirstLine! >>"%OUTTEXTFILE%"
)
set "FirstLine="
)
if not "!Line!"=="" (
if "!Line:~-4!"=="!EndFirstLine!" (
set "FirstLine=!Line:~0,-2!"
) else (
echo !Line!>>"%OUTTEXTFILE%"
)
)
)
if exist "%OUTTEXTFILE%" (
copy "%OUTTEXTFILE%" "%INTEXTFILE%" >nul
del "%OUTTEXTFILE%"
)
:EndBatch
endlocal
此批处理文件也会删除空行。这是无法避免的,因为for命令在解析文件时忽略空行。@ECHO OFF
SETLOCAL
(
对于/f“delims=”%(q6288377.txt)中的%%a,请执行以下操作(
设置行=%%a
SETLOCAL ENABLEDELAYEDEXPANSION
回音(^)!行:~3!
端部
)
)>newfile.txt
(
对于/f“delims=”%(q6288377.txt)中的%%a,请执行以下操作(
设置行=%%a
SETLOCAL ENABLEDELAYEDEXPANSION
如果“!line:~1,2!”==“20”(回显(^“!line:~3!))其他(回显(%%a)
端部
)
)>newfile2.txt
后藤:EOF
如果没有明确的预期结果,解决一个被称为“我的代码没有完成我想要它做的事情”的问题是非常困难的
您的问题似乎是删除文本文件第2列和第3列中的“20”(我更改了名称以适应我的系统)
上面的代码假设文件的每一行都开始“
。第一部分任意删除第2列和第3列中的任何字符,创建newfile.txt
。第二部分仅选择第2列和第3列中20
的行并删除这些列,而不选择其他行并创建newfile2.txt
您已将要求从“SPACENEWLINE”2014更改为3个终端空间,没有说明第一行是否为例外(前面不会有“SPACENEWLINE”)因此,上述内容可能不适用。不知道序列的存在是否重要——而且很可能像sed
这样的实用程序更适合这项任务(谷歌是你的朋友)
[编辑扩展问题]
@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
PUSHD“%sourcedir%”
对于%%u英寸(q6288377*.txt)请执行以下操作(
(
对于/f“usebackqdelims=“%%a IN(“%%u”)DO(
设置行=%%a
SETLOCAL ENABLEDELAYEDEXPANSION
回音(^)!行:~3!
端部
)
)>%%~nu.xtx
)
邻苯二胺
后藤:EOF
您需要更改sourcedir
的设置以适应您的环境。生成的文件将是samename.xtx。不要试图直接覆盖现有文件
您还可以在不同的目录中创建新文件,方法是在%%~nu.xtx
前面加一个目录名,例如“c:\some random\directory\%%~nu.xtx”-“如果目录或文件名包含分隔符(如空格),“用引号括起来”。~nu
表示“%%u的名称
-有关详细信息,请参见提示符中的获取/?
解决一个完整的问题总比解决一个零碎的问题容易。完整的描述可能会影响使用的方法。所以你有问题吗?想详细说明吗?嗨,我只是添加了一些源文本作为示例。谢谢!这个脚本不适合我。我用一个代码示例编辑了最初的帖子。谢谢!所以你只想修剪trailing空格并删除第2和第3个字符(世纪)从所有行。这与最初描述的完全不同。我认为,CSV文件中的字段值中有换行符,因此在某些条件下有必要将两行连接到一行。因此,我为真正需要的内容编写了一个完全错误的代码。输入和输出示例是的,你是对的。对不起,我忘了发布一个源文本示例。此代码运行良好,谢谢!让我问你最后一个问题:是否可以修改此脚本以将其应用于文件夹中的所有CSV文件?
@echo off
setlocal EnableDelayedExpansion
set "INTEXTFILE=FILE_IN_CSV.csv"
if not exist "%INTEXTFILE%" goto EndBatch
set "OUTTEXTFILE=%TEMP%\csv_replace.tmp"
if exist "%OUTTEXTFILE%" del "%OUTTEXTFILE%"
set "FirstLine="
set "EndFirstLine="" "
set "BeginSecondLine="2014"
for /f "usebackq delims=" %%A in ("%INTEXTFILE%") do (
set "Line=%%A"
if not "!FirstLine!"=="" (
if "!Line:~0,5!"=="!BeginSecondLine!" (
set "FirstLine=!FirstLine!"!Line:~4!"
echo !FirstLine!>>"%OUTTEXTFILE%"
set "Line="
) else (
echo !FirstLine! >>"%OUTTEXTFILE%"
)
set "FirstLine="
)
if not "!Line!"=="" (
if "!Line:~-4!"=="!EndFirstLine!" (
set "FirstLine=!Line:~0,-2!"
) else (
echo !Line!>>"%OUTTEXTFILE%"
)
)
)
if exist "%OUTTEXTFILE%" (
copy "%OUTTEXTFILE%" "%INTEXTFILE%" >nul
del "%OUTTEXTFILE%"
)
:EndBatch
endlocal