在特定行

时间:2017-04-04 07:34:44

标签: xml batch-file

我想创建一个批处理脚本,它将执行以下操作: 查找特定的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>

另一种解决方案是将标签插入特定的行号。 任何人都可以帮助解决方案吗?我搜索过,但没有发现任何关于我的问题。

感谢您的帮助!

1 个答案:

答案 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>"