BAT文件用两行替换字符串

时间:2014-10-09 21:41:11

标签: batch-file replace

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

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

""  
"2014

所以,像:(双引号)(双引号)(空格)(空格)(换行)(双引号)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个。

2 个答案:

答案 0 :(得分:0)

你的方法无法正常工作。

  1. 命令for始终逐行处理文本。因此,不可能将2行作为字符串添加到环境变量中并修改此字符串。

  2. 段落符号(代码值B6十六进制)在查看显示行结尾的文本文件时只是一个占位符。 CSV文件包含回车符(0D)和换行符(0A),命令for始终将其解释为与您指定的内容无关的分隔符。

  3. 最好使用UltraEdit或Notepad ++或Sublime Text等文本编辑器在文件中进行替换。甚至不需要在那些编辑器中运行正则表达式替换。但是使用Perl正则表达式""\s+"2014作为搜索字符串并替换字符串"""4将导致您想要的修改。

    还有为替换文件中的字符串而编写的控制台应用程序。看看How can you find and replace text in a file using the Windows command-line environment?

    使用以下代码,仍然可以使用标准命令搜索"" \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在解析文件时忽略空行。

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
(
 FOR /f "delims=" %%a IN (q6288377.txt) DO (
 SET line=%%a
 SETLOCAL ENABLEDELAYEDEXPANSION
 ECHO(^"!line:~3!
 endlocal
 )
)>newfile.txt
(
 FOR /f "delims=" %%a IN (q6288377.txt) DO (
 SET line=%%a
 SETLOCAL ENABLEDELAYEDEXPANSION
 IF "!line:~1,2!"=="20" (ECHO(^"!line:~3!) else (echo(%%a)
 endlocal
 )
)>newfile2.txt

GOTO :EOF

如果没有明确表示期望的结果,解决“我的代码不能做我想做的事情”这个问题是非常困难的。

您的问题似乎是删除文本文件第2列和第3列中的“20”(我更改了名称以适合我的系统。)

上面的代码假设文件的每个行都是"。第一部分任意删除第2列和第3列中的任何字符,创建newfile.txt。第二个选择仅选择第2列和第3列中20的行并删除这些列,只留下其他行并创建newfile2.txt

您已将要求从“”空间 空间 换行符“2014更改为3个终端空间,未说明第一行是否为一个例外(它不会以“”空格 空格 换行符),因此上述内容可能不适用。不知道是否序列的存在是否重要 - 并且很可能像sed这样的实用程序更适合任务(Google是你的朋友)


[编辑扩展问题]

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
PUSHD "%sourcedir%"
FOR %%u IN (q6288377*.txt) DO (
(
 FOR /f "usebackqdelims=" %%a IN ("%%u") DO (
 SET line=%%a
 SETLOCAL ENABLEDELAYEDEXPANSION
 ECHO(^"!line:~3!
 endlocal
 )
)>%%~nu.xtx
)
popd

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。生成的文件将是 samename .xtx。不要试图直接覆盖现有文件。

您还可以通过在%%~nu.xtx前加一个目录名称来创建不同目录中的新文件,例如“c:\ some random \ directory \ %% ~nu.xtx” - “括在引号中”如果目录或文件名包含分隔符(如空格)。 ~nu表示“%%u的名称 - 请参阅提示中的 /?以获取更多信息。

解决整个问题总比解决问题容易。完整描述可能会影响使用的方法。