当两个字符串都可能包含保留字符时,如何替换字符串中的子字符串?

时间:2018-08-27 18:38:52

标签: batch-file replace

当两个字符串中都有保留字符时,我想不出从字符串中删除子字符串的方法。我尝试过的一切都没有运气。

我刚开始批量处理,但是现在我使用的是此处所述的方法,但进行了修改:String replacement in batch file

这是我的代码示例,但是对!根本不起作用!或:在字符串中:

:: NOT WORKING
:RemoveWordsFromFileInLine

    :: %1 string to remove
    :: %2 source file
    :: %3 destination file

    setlocal enabledelayedexpansion    
    :: Loop through each "word" of every "line"
    set "toReplace=%1 "
    set "blank="

    del %3
    for /F "tokens=* delims=" %%a in (%2) do (    
    setlocal disabledelayedexpansion    
        echo "line=%%a"
        echo line is %line%

    setlocal enabledelayedexpansion    
        set "newLine=!line:%toReplace%=%blank%!"
        echo newLine is !newLine!
        @echo !newLine! >>%3
    endlocal    
    )

    if exist %3 ( move /y %3 %2 >nul )

GOTO:EOF

如您所见,我尝试在行变量的“集合”上禁用延迟扩展,但是我不能在替换部分中做到这一点。

文件中的一些示例字符串为:

<!-- XML Comment goes here -->
<planets> Mars world:Earth </planets>
<planets> Venus Earth Mercury </planets>

一些我想替换的示例字符串是:

world:Earth
Earth

任何人都对如何使字符串替换起作用有任何想法?我已经尝试了很多事情,通常涉及到在各个地方都用双引号引起来(例如,在字符串replace语句中的行变量周围),但是我还没有运气。

1 个答案:

答案 0 :(得分:0)

感谢aschipfl帮助我解决了这个问题;我的主要问题归结于对setlocal / endlocal的不良使用。我很确定要解决这个问题是导致我所有尝试失败的原因。

最终密码结尾:

:RemoveWordsFromFileInLine

    :: %1 string to remove
    :: %2 source file
    :: %3 destination file

    setlocal disabledelayedexpansion    
    :: Loop through each "word" of every "line"
    set "toReplace=%1 "
    set "blank="

    del %3
    for /F "tokens=* delims=" %%a in (%2) do (

        set "line=%%a"

    setlocal enabledelayedexpansion    
        set "newLine=!line:%toReplace%=%blank%!"
        @echo !newLine! >>%3
    endlocal    
    )
    endlocal    

    if exist %3 ( move /y %3 %2 >nul )

GOTO:EOF

需要注意的最大事情(据我了解):

  • 设置行var需要disableelayedexpansion,否则它将尝试 解析!
  • 将替换功能要求将enabledelayedexpansion设置为启用 因为我们需要知道在循环的那一点线的值是什么。