bat将文本从文件file1替换为file2(相对搜索)

时间:2012-11-10 11:56:54

标签: batch-file full-text-search substr

textfile1是源文件,textfile2是目标文件

示例textfile1.txt:

  server1.net 2100 /l /n /k port:2000,server2.net 2100 /l /n /k port:20000

textfile2.txt:

  server3.net 2000 /l /k port:xxxx,server4.net 2000 /l /k port:yyyyy

我需要在textfile1.txt中找到“port:”字符,并在textfile2.txt中找到端口号(“port:”characteres之后的n个字符)

注意:portnumber是textfile1中的变量号,但文本:“port:”是固定的。 感谢

基本上我需要在textfile1和textfile2中放入相同的端口号

3 个答案:

答案 0 :(得分:1)

我不明白你为什么要用批处理这个任务 - 使用其他脚本语言如VBScript,JScript或PowerShell会更简单。

但这是一个原生批处理解决方案。我的解决方案没有假设每个命令中的选项顺序。它允许/port:nnnn之前和之后的任意数量的选项。

@echo off
setlocal enableDelayedExpansion

::read the line from textfile1
set "str="
<"textfile1.txt" set /p "str="
if not defined str exit /b

::enclose each command in quotes
set "str="!str:,=","!""

::extract the port from each command into an array
set /a n=0
for %%A in (!str!) do (
  set "cmd=%%~A"
  set /a n+=1
  for /f %%B in ("!cmd:*port:=!") do set "port!n!=%%B"
)

::read the line from textfile2
set "str="
<"textfile2.txt" set /p "str="
if not defined str exit /b

::enclose each command in quotes
set "str="!str:,=","!""

::process each command
set /a n=0
set "ln="
for %%A in (!str!) do (
  set "cmd=%%~A"
  REM break the command into 2 parts, discarding port:
  REM %%B = before port
  REM %%E = after port
  for /f "tokens=1* delims=," %%B in ("!cmd:port:=,!") do (
    for /f "tokens=1*" %%D in ("%%C") do (
      set /a n+=1
      REM transfer !n! into %%N
      for %%N in (!n!) do (
        REM build the new line
        set "ln=!ln!,%%B port:!port%%N! %%E"
      )
    )
  )
)

::remove space before comma
set "ln=!ln: ,=,!"

::write the result back to textfile2
>"textfile2.txt" echo !ln:~1!

答案 1 :(得分:1)

下面的批处理文件适用于两个文本文件中的无限服务器列表,并允许port:nnnn选项包含在该行的任何位置。它不会检查任何错误,使其更简单。

@echo off
setlocal EnableDelayedExpansion
rem Read data from both files
set /P "data1=" < textfile1.txt
set /P "data2=" < textfile2.txt
rem Replace "port" data in all servers
:nextServer
   rem Get port number after "port:" in first data and eliminate it
   for /F "tokens=1* delims=," %%a in ("%data1:*port:=%") do set port1=%%a& set data1=%%b
   rem Replace port number in second data and change colon by semicolon
   for /F "tokens=1  delims=," %%a in ("%data2:*port:=%") do set data2=!data2::%%a=;%port1%!
rem Pass to next server, if any
if defined data1 goto nextServer
rem Output result restoring colons
echo %data2:;=:%

例如,使用此数据:

  server1.net 2100 /l /n /k port:2000,server2.net 2100 /l /n /k port:20000,server5.net 2100 /l /n /k port:1234

server3.net 2000 /l /k port:xxxx,server4.net 2000 /l /k port:yyyyy,server6.net 2000 /l /k port:zzzz

输出结果为:

server3.net 2000 /l /k port:2000,server4.net 2000 /l /k port:20000,server6.net 2000 /l /k port:1234

答案 2 :(得分:0)

对你长期想要做的事情进行一点澄清可能会有所帮助,但与此同时,这是一个我刚编写和测试的剧本,它完全符合你的要求。

for /f "tokens=6,12 delims=, " %%a in (textfile1.txt)do (
set portOne=%%a
set portTwo=%%b
call :writeTextTwo
)
type texttwo_temp>textfile2.txt
goto :EOF
:writeTextTwo
for /f "tokens=1-12 delims=, " %%c in (textfile2.txt)do (echo %%c %%d %%e %%f %portOne%,%%h %%i %%j %%k %portTwo% >>texttwo_temp )
 goto :EOF

我希望这会有所帮助。