需要使用批处理脚本拉出两个XML标记之间的所有字符串。我只想在<appSettings>
和</appSettings>
之间拉出字符串。本节上下有许多字符串;需要忽略所有其他字符串。
我尝试了this解决方案,但由于我的开始和结束字符串包含“<
”,我相信会抛弃代码。
示例:
File1.txt(从此文件中读取)
::Many lines of code to start with. ~150 lines
<appSettings>
<add key="1" value="False" />
<add key="2" value="False" />
<add key="3" value="False" />
<add key="4" value="False" />
<add key="5" value="False" />
<add key="6" value="False" />
<add key="7" value="False" />
<add key="8" value="False" />
<add key="9" value="False" />
<add key="10" value="False" />
<add key="11" value="False" />
<add key="12" value="False" />
<add key="13" value="False" />
<add key="14" value="False" />
<add key="15" value="False" />
<add key="16" value="False" />
<add key="17" value="False" />
</appSettings>
::Many strings below this ~25 lines
File2.txt (创建并写入此文件)
*应创建此文件,并包含来自File1.txt的<appSettings>
和</appSettings>
之间的所有字符串
答案 0 :(得分:0)
只要<appSettings>
标签本身在线上,此解决方案就应该有效。我试图考虑无关的空白(标签之外)。该脚本的第一个参数是XML文件。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET INSIDE_ELT=0
FOR /F "delims=" %%l IN (%~1) DO (
SET "LINE=%%~l"
SET "LINE=!LINE:<=__-_!"
SET "LINE=!LINE:>=_-__!"
CALL :STRIP !LINE!
SET "LINE=!_STRIPPED:__-_=<!"
SET "LINE=!LINE:_-__=>!"
IF "!LINE!"=="</appSettings>" SET INSIDE_ELT=0
IF "!INSIDE_ELT!"=="1" @ECHO %%l
IF "!LINE!"=="<appSettings>" SET INSIDE_ELT=1
)
:STRIP
SET "_STRIPPED=%*"
EXIT /B
答案 1 :(得分:0)
这是一个非常简单快速的解决方案,使用REPL.BAT - a hybrid JScript/batch utility执行正则表达式搜索并替换stdin并将结果写入stdout。该脚本是纯脚本,可以从XP开始在任何现代Windows机器上本机运行。完整的文档嵌入在脚本中。
假设REPL.BAT位于您当前的目录中,或者更好,位于PATH中的某个位置,那么:
type file1.txt|repl "[\s\S]*?<appSettings>([\s\S]*?)</appSettings>[\s\S]*" $1 m >file2.txt
答案 2 :(得分:0)
对于这项任务,Aacini的FINDREPL.BAT非常直观,而且非常快速和强大。
以下是名为findrepl.bat
的帮助程序批处理文件 - 从https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
将findrepl.bat
放在与批处理文件相同的文件夹中或路径上。
type file1.txt|findrepl /i "<appSettings>" /e:"</appSettings>" >file2.txt