我想创建一个批处理脚本,它将执行以下操作: 查找特定的xml行,并添加特定的多行标记。
例如:找到这一行:
<tree_node>
<rule_name>bla</rule_name>
<rule_argument>bla</rule_argument>
<acl_name>bla</acl_name>
</tree_node>
然后添加这组行:
<tree_node>
<rule_name>TEST1</rule_name>
<rule_argument>TEST2</rule_argument>
<acl_name>TEST3</acl_name>
</tree_node>
另一种解决方案是将标签插入特定的行号。 任何人都可以帮助解决方案吗?我搜索过,但没有发现任何关于我的问题。
感谢您的帮助!
答案 0 :(得分:0)
下面的批处理文件完全您要求的内容:
@echo off
setlocal EnableDelayedExpansion
rem Define CR variable containing a Carriage Return (0x0D)
for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a"
rem Define LF variable containing a Line Feed (0x0A)
set LF=^
%Do not remove%
%these lines%
rem Define the string to find
set "find=<tree_node>!CR!!LF!"
set "find=!find! <rule_name>bla</rule_name>!CR!!LF!"
set "find=!find! <rule_argument>bla</rule_argument>!CR!!LF!"
set "find=!find! <acl_name>bla</acl_name>!CR!!LF!"
set "find=!find!</tree_node>"
rem Get the number of lines to copy
findstr /N /R /C:"!find!" input.txt > findstr.tmp
for /F "delims=:" %%a in (findstr.tmp) do set /A lines=%%a+4
del findstr.tmp
rem Read from input file
< input.txt (
rem Copy the appropriate number of lines
for /L %%i in (1,1,%lines%) do (
set /P "line="
echo !line!
)
rem Add the new lines
echo ^<tree_node^>
echo ^<rule_name^>TEST1^</rule_name^>
echo ^<rule_argument^>TEST2^</rule_argument^>
echo ^<acl_name^>TEST3^</acl_name^>
echo ^</tree_node^>
rem Copy the rest of lines
findstr "^"
rem Write to output file
) > output.txt
move /Y output.txt input.txt
有关用于查找多行字符串的方法的进一步说明,请参阅this answer。
编辑:如何定义更大的搜索文字
findstr
命令对用于搜索文件中文本的多行字符串的长度有限制。但是,您不需要在多行字符串中包含此类部分的每个字符!您可以使用由正则表达式组成的较短字符串,该正则表达式覆盖文件中的多个字符;例如,.*
正则表达式匹配任意数量的字符,这些字符由放置在其之前和之后的字符分隔。这样,您只需在搜索文本中包含足够的部分,以使其在文件中唯一。
例如,如果文件中只有一个<rule_name>bla</rule_name>
部分,则可以使用此较短的文本定义此代码中相同的五行搜索字符串:
rem Define the string to find
set "find=<tree_node>!CR!!LF!"
set "find=!find! <rule_name>bla</rule_name>!CR!!LF!"
set "find=!find!.*!CR!!LF!"
set "find=!find!.*!CR!!LF!"
set "find=!find!</tree_node>"