如何使用.bat查找和替换文本中的特定字符串?

时间:2014-07-01 13:24:18

标签: string batch-file replace

我有一个xml:

    <?xml version="1.0"?>
<arquivoposicao_4_01 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<fundo xmlns="http://tempuri.org/">
<header>

我只想替换de string“xmlns =”,例如:“dog =”。

我正在使用这个.bat:

@echo off
REM -- Prepare the Command Processor --
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
set "line=%%B"


  if defined line (
    call set "line=echo.%%line:%~1=%~2%%"
    for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
) ELSE echo.
)

我使用:file.bat“xmlns =”“dog =”nome.txt 但它将“xlmns =”替换为“= dog =”。

PS:我只想替换第三行,第二行不是。

2 个答案:

答案 0 :(得分:1)

@ECHO Off
REM -- Prepare the Command Processor --
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION
REM if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
:: Replacing parameters with fixed strings for testing
SET "p1=xmlns"
SET "p2=dog"
SET "p3=q24511441.txt"
for /f "tokens=1,* delims=]" %%A in ('"type %p3%|find /n /v """') do (
 set "line=%%B"
 if defined line (
 ECHO("%%B"|FIND "%p1%="
  IF ERRORLEVEL 1 (ECHO(%%B) ELSE (
   call set "line=%%line:%p1%=%p2%%%"
   for /f "tokens=1*delims==" %%X in ('set line') do ECHO(%%Y
  )
 ) ELSE ECHO(
)
GOTO :EOF

这是一种类似于你想要的东西的方法。

问题似乎是替换文本语法使用=将目标字符串与替换字符串分开。

你的日常工作似乎旨在成为一个普遍的替换 - 一个字符串与另一个例程。批处理并不适合这项任务,但可以在限制范围内完成。

我已将参数%1..%3替换为固定文本以进行测试。该例程将用于将%1=替换为%2=,并不完美。它将xmlns单独留在不包含xmlns=的行上,并替换包含xmlnsxmlns=的行上的任何dog

我使用了一个名为q24511441.txt的文件,其中包含我的测试数据。

答案 1 :(得分:0)

替换包含“=”的这样的字符串在windows批处理中是非常明显的,因为它无法转义或引用它(我知道)。

请点击此处查看一些提示:Escaping an equals sign in DOS batch string replacement command

使用search / replace和regex解析/修改批处理脚本中的XML通常是一个坏主意,可能存在大量问题和问题。最好用提供XML解析库的语言编写程序(例如java,perl等)。