用列表中的值批量替换文件中的字符串

问题描述 投票:0回答:1

我有一个简单的问题,但我现在已经苦苦挣扎了几天才能运行一个简单的批处理脚本。我想要做的就是遍历一个列表(例如

123,456,789
)并用
123
替换文件中字符串的第一次和第二次出现,以及接下来的两次用
456
等等.. .

所以这个文件的内容:

xyz
foo xyz
foo xyz
xyz
xyz foo xyz
xyz foo xyz
xyz
foo xyz
foo xyz
xyz

之后看起来像这样:

xyz
123 xyz
123 xyz
xyz
xyz 456 xyz
xyz 456 xyz
xyz
789 xyz
789 xyz
xyz

我试过 chatGPT,但因为我是批处理菜鸟,我不知道我做错了什么,这就是我得到的:

@echo off
set "infile=replaceTest.sql"
set "outfile=replaceTest_out.sql"
set SEARCH=foo
set LIST=123,456,789
setlocal EnableDelayedExpansion

(
    for %%i in (%LIST%) do (
        set REPLACE=%%i
        set /a count=0  
        for /f "delims=" %%A in ('"findstr /n ^^ %infile%"') do (
            set "line=%%A"
            set "line=!line:*:=!"
            (echo !line! | findstr /i /c:%SEARCH% >nul) && (set /a count+=1)
            if !count! LSS 3 (
                REM set LINE=!LINE:%SEARCH%=%REPLACE%!
                set "line=!line:foo=bar!"
            )
            echo(!line!
        )
    ) > "%outfile%"
)

但这只能取代前两个......

和行

REM set LINE=!LINE:%SEARCH%=%REPLACE%!
只替换
foo
什么都没有(这就是它在这里被注释掉的原因).

windows loops batch-file
1个回答
0
投票
@ECHO Off
SETLOCAL enabledelayedexpansion
rem The following settings for the directories and filenames are names
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
SET "filename1=%sourcedir%\q75615698.txt"
SET "outfile=%destdir%\outfile.txt"

set "SEARCH=foo"
set "LIST=123,456,789"
SET /a count=0
SET /a listindex=1

(
FOR /f "usebackqdelims=" %%e IN ("%filename1%") DO (
 SET "line=%%e"
 IF "%%e"=="!line:%search%=!" (ECHO %%e) ELSE (
  SET /a listcount=0
  FOR %%r IN (%list%) DO IF DEFINED line (
   SET /a listcount+=1
   IF !listcount!==!listindex! (
    ECHO !line:%search%=%%r!
    SET /a count+=1
    IF !count!==2 SET /a count=0&SET /a listindex+=1
    SET "line="
   )
  )
 )
)
)>"%outfile%"

GOTO :EOF

rem 在应用于真实数据之前,始终对照测试目录进行验证。

请注意,如果文件名不包含空格等分隔符,则

usebackq
%filename1%
两边的引号都可以省略。

Hmm - ChatGPT 被禁止 但我相信它实际上是由 ChatGPT 生成的 answers - 这个问题说明了原因。

抛开源文本的人工性质不谈,这种方法是值得怀疑的。

对于源代码中的每一行,

  • 如果它不包含搜索字符串,则重新生成它,
  • 找到替换字符串,它是
    listindex
    中的第
    list
    条目,用替换回显字符串并计算1个替换。如果我们做了 2,请重置计数并选择下一个
    listindex
    。清除
    line
    以便
    for %%r
    的操作被禁用,直到从源中读取下一行。
© www.soinside.com 2019 - 2024. All rights reserved.