【问题标题】:How can I find and replace string with another string in batch script?如何在批处理脚本中查找字符串并将其替换为另一个字符串?
【发布时间】:2014-12-22 14:41:29
【问题描述】:

我正在尝试在文件中查找字符串并将其替换为另一个字符串。

我有一个 XML 文件,其中 port= 存在于多个位置。每个端口都有不同的值,例如 port="443"port="8011"

我想找到一个特定的port 及其值。 port 的当前值在批处理执行时未知,因为该值会发生变化。此变量和 XML 文件中一个特定 port 属性的批处理执行未知值应替换为我作为参数传递给批处理文件的新值。

如何从文件中找到特定的 port 值并将其替换为新值?

我已使用以下代码替换字符串,但我无法更改其值。

if EXIST %ConfPath% (echo "here") ELSE (
    for /f "tokens=1,* delims=¶" %%A in ( '"type %file%"' ) do (
        SET string=%%A

        SET modified=!string:%oldport%=%newport%!

        echo !modified! 
    )
)

编辑:

这是我的 XML 文件:

<?xml version='1.0' encoding='utf-8'?> 
<Server port="first" shutdown="SHUTDOWN">  
<Listener className="org.apache.catalina.core.JasperListener" /> 
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 
<GlobalNamingResources> 
<Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> 
</GlobalNamingResources> 
<Service name="Catalina">  
<Connector port="second" redirectPort="forth" /> 
<Connector port="third" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8" keystoreFile="myKey" keystorePass="myPass" /> 
</Service> 
</Server> 

上述文件中有四个端口。

我想将port="third" 更改为port="newPort"

直到现在我已经替换了字符串,但我无法将它与剩余的文件连接起来。

首先我得到行号,然后用引号分割并替换。但我无法连接它。有东西不见了,但我找不到。

我的批号是:

for /f "tokens=1,* delims=" %%A in ( '"type %file%"' ) do (
    SET /a line+=1
    IF !line!==11 (
        SET string=%%A
        for /f tokens^=2^ delims^=^" %%I in ( "!string!" ) do (set repPort=%%I)
        SET modified=!string:repPort=PORT!
    )
    echo !modified!
)

这是正确的方法吗?我该如何连接?

【问题讨论】:

  • 为了节省时间,这里是jrepl.batGnuWin32 sed 的必填链接,这些链接通常出现在这些“如何替换文本文件中的文本”问题中。
  • 你试过&gt;&gt;newfile.xml echo !modified!吗?您是否还打算从 ¶ 剥离每一行的行尾?
  • @rojo thnx rojo!!是的,我打算在每一行上剥离到行尾。另外我想从多个文本中查找和替换特定文本。
  • @Mofi thxn mofi!!它与您提到但不重复的链接有关,因为我不想用另一个替换每个匹配项,但我想替换一个特定匹配项。

标签: batch-file scripting window


【解决方案1】:

How can you find and replace text in a file using the Windows command-line environment? 列出了几个用于从命令行替换文件中的字符串的工具。

我喜欢免费的控制台工具 xchang32.exe,因为它功能强大且非常易于使用。

我将您的 XML 文件的内容复制到一个文件中并以 Test.xml 的名称保存。

然后我执行了以下命令:

xchang32.exe Test.xml "port=^34third^34 protocol" "port=^34newPort^34 protocol"

该命令仅在文件中更改

<Connector port="third" protocol="HTTP/1.1" SSLEnabled="..." /> 

<Connector port="newPort" protocol="HTTP/1.1" SSLEnabled="..." /> 

^34 是双引号字符 " 的转义序列,其十进制代码值为 34。

xchang32.exe /? 在命令提示符窗口中输入并执行会输出此替换工具的帮助。

当然,您也可以使用参考主题中建议的任何其他方法。您只需在搜索和替换字符串中包含 protocol 即可仅修改应修改的端口号,而忽略所有其他端口号。由于 XML 文件中的字符 &lt;&gt;" 在命令行中具有特殊含义,因此仅使用 Windows 标准命令的解决方案更加困难。


编辑:

在执行批处理文件时不知道文件中的当前端口号当然是一个重要的事实。从最初的问题来看,这对我来说并不是很清楚。这使它变得更加困难。

一种解决方案是首先搜索现有端口值,一旦找到就进行替换。

@echo off

rem Search in file for a line where first opening tag is
rem "Connector" which has as first attribute "port" and
rem one more attribute "protocol" and assign the value
rem of the attribute port to an environment variable.

for /F "tokens=1-4 delims==<     " %%A in (Test.xml) do (
    if "%%A"=="Connector" (
        if "%%B"=="port" (
            if "%%D"=="protocol" (
                set "PortNumber=%%~C"
                goto Replace
            )
        )
    )
)
echo Could not find the port value of interest.
goto :EOF

:Replace
xchang32.exe Test.xml "port=^34,%PortNumber%^34 protocol" "port=^34,%~1^34 protocol"
set "PortNumber="

注意:

delims= 后面有 4 个字符与命令 for:

  1. 等号,
  2. 左尖括号,
  3. 水平制表符(不是浏览器显示的一系列空格)
  4. 一个空格字符。

分隔符的顺序很重要,否则命令行解释器会因为语法错误而退出批处理脚本。

感兴趣的行由命令 for 与这 4 个分隔符分成:

  • 令牌 1:Connector
  • 令牌 2:port
  • 令牌 3:"third"
  • 令牌 4:protocol
  • 以及更多不感兴趣的令牌。

这 4 个标记被分配给循环变量 A(标记名称)、B(第一个属性的名称)、C(值第一个属性的名称)和 D(第二个属性的名称。

变量ABD的值用于检查是否找到了正确的行。变量 C 的值在肯定检查时分配给环境变量,并删除周围的双引号。然后循环退出并跳转以替换部分批处理脚本。

再次免费工具xchang32.exe用于在文件中进行替换而不更改任何其他内容。由于分配给属性 port 的值是一个整数值,因此需要在第一个 ^34 之后使用逗号,以便让工具知道引用双引号字符的整数在哪里结束。

有关命令 for 的帮助,请在命令提示符窗口中执行 for /?help for

【讨论】:

  • 但是还有一件事,第三个是动态变量,我不知道。那我现在怎么能做到呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 2012-10-24
相关资源
最近更新 更多