【问题标题】:How to replace double quotes in findstr batch file如何替换findstr批处理文件中的双引号
【发布时间】:2012-11-23 14:15:51
【问题描述】:

我不确定我的旧帐户发生了什么,所以我不得不创建这个新帐户。我写的批处理文件有问题。我让它在用户输入某些信息的地方工作,然后输入将替换文件中的文本。但是,我遇到的问题似乎无法在此处找到确切的答案或帮助我解决问题是...如何替换引号内的数据?我尝试转义引号,但我不确定它是否找到了它,只是没有替换它或什么。这是部分

setlocal DisableDelayedExpansion
(
  for /F "usebackq delims=" %%a in ("%drive%:\bdi\%bdi1%\importer.config") do (
    set "str=%%a"
    setlocal EnableDelayedExpansion
    set "str=!str:""saveTcpMessage"" value=""True""="saveTcpMessage" value="False"!"

    echo(!str!
    endlocal
  )
) > %drive%:\bdi\%bdi1%\newfile.txt
%drive%:
cd "%drive%:\bdi\%bdi1%"
del importer.config
rename newfile.txt importer.config
pause

在上面的示例中,我希望批处理文件在名为 importer.config 的文件中找到以下字符串

<add key="saveTcpMessage" value="True" />

如果找到上面的值,我希望它替换为:

<add key="saveTcpMessage" value="False" />

我很确定 find 部分可以正常工作,因为我看到您必须转义 dbl 引号..但是替换部分不起作用。我也尝试在替换中使用双引号,但无济于事。

任何帮助将不胜感激。

【问题讨论】:

  • 我使用名为“xmlStarlet”的 DOS 工具来编辑 DOS 脚本中的 XML 文件。

标签: file batch-file double quotes findstr


【解决方案1】:

" 到 `

类似这样的:

@echo off
set quot=^"
setlocal enabledelayedexpansion
for /f "usebackq skip=1 delims=" %%i in ( `wmic bios get BIOSVersion ^
 ^| findstr /r /v "^$"`) do (
for /f tokens^=*^ delims^=^"  %%a in ("%%i") do set unquoted=%%a
set "unquoted=!unquoted:%quot%=`!"
echo .
echo !unquoted!
echo .
)

【讨论】:

    【解决方案2】:

    cmd.exe 解析器不会像这样转义引号。为了转义引号,您必须使用^",但这意味着必须转义所有引号,以及所有特殊字符,如&lt; &amp; 等。一旦解析器看到未转义的引号,那么引号语义就在玩直到遇到下一个报价。引用引用是不可能的。

    但在您的情况下,上述所有内容并不重要:您的整个方法无法工作,因为不可能在变量扩展搜索和替换的搜索部分包含=。它是困扰批处理编程的众多小“gottchas”之一。

    如果您可以保证与
    &lt;add key="saveTcpMessage" value="True" /&gt; 元素在同一行中不存在其他 XML 元素,那么您可以简单地验证您的行是否正确,然后将“False”替换为“True”。但您很可能无法做出这样的保证。 XML 没有固有的行结构,因此可以将数据重新格式化为一条连续的行,它仍然是具有相同含义的有效 XML。或者可以将元素拆分为多行。

    批处理文件通常不太擅长处理文本文件,尤其是它们在处理 XML 方面很糟糕。你可以做到,但需要大量晦涩难懂的代码,而且速度会很慢。除非您非常聪明,否则任何批处理文件解决方案都可能很脆弱,这意味着有人可能会重新格式化 XML 输入并破坏您的代码。

    我建议您使用其他一些语言或实用程序 - 理想情况下是设计用于处理 XML 的实用程序。但 VBScript、JScript 或 PowerShell 也可以工作。这些语言至少可以让您轻松地进行您正在尝试的文字搜索和替换。

    如果您真的想使用批处理脚本,我已经在 DosTips 上发布了The "ultimate" file search and replace batch utility。代码中嵌入了有关如何使用脚本的文档。

    另一种选择是混合 JScript/Batch 解决方案:regex search and replace for batch - Easily edit files!,再次发布在 DosTips 上。完整的文档也嵌入在该代码中。

    假设您创建了在第二个链接中找到的 REPL.BAT 脚本,您可以执行以下操作:

    @echo off
    setlocal
    
    :: define drive and bdi1 as needed
    
    set "file=%drive%:\bdi\%bdi1%\importer.config"
    set "search=<add key="saveTcpMessage" value="True" />"
    set "replace=<add key="saveTcpMessage" value="False" />"
    
    type "%file% | repl.bat search replace el >"%file%.new"
    move /y "%file%.new" "%file%"
    

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多