Batch file BAT文件替换两行中的字符串

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

我正在Windows中编写一个脚本,一个.BAT文件,以替换:

请注意,这里有一个ENTER,我的意思是字符串分为两行。现在看起来更复杂了:在两个双引号后面有两个空格,然后是“回车”

比如:(双引号)(双引号)(空格)(空格)(新行)(双引号)2014

我在这方面有问题。以下是脚本的外观:

@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行作为字符串放入环境变量并修改此字符串

  • 当查看显示行尾的文本文件时,段落符号<代码>¨(代码值B6十六进制)只是一个占位符。CSV文件包含回车符(0D)和换行符(0A),该命令
    for
    始终将其解释为独立于指定内容的分隔符字符

  • 最好使用文本编辑器(如UltraEdit、Notepad++或Sublime text)来替换文件。甚至不需要在这些编辑器中运行正则表达式替换。但是,将Perl正则表达式
    “\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