【问题标题】:Batch Find and Copy Lines批量查找和复制行
【发布时间】:2026-01-18 13:40:01
【问题描述】:

我需要剥离文本文件的一部分并将其写入另一个文件。剥离的文本文件也应保存。

之前:

Original.txt = "<xml><something>values</something><script>TEXT-TO-DELETE</script></xml>"

之后:

Original.txt = "<xml><something>values</something><script></script></xml>"

Original_script.txt = "TEXT-TO-DELETE"

.. 这是一个多行文件,因此脚本部分跨越多行。

我尝试过发布的脚本,但始终无法理解语法。

"@echo off & setlocal 
set "Data=D:\Original.txt" 
set "Bak=%Data%.bak" 
move "%Data%" "%Bak%" 
for /f "usebackq delims=" %%i in ("%Bak%") do set "LINE=%%i" & call :ProcessLine 
REM del "%Bak%" 
goto :eof 
:ProcessLine 
echo %LINE%>>"%Data%"
echo %LINE%|findstr /b "<script>">nul || goto :eof 
goto :eof"

这应该适用于 Windows 计算机 ..(更新的操作系统支持)

编辑:因为我无法在自己的线程上回答,所以我在这里做:

感谢您的回答。 不幸的是,我不想为此使用共享软件。 我正在解析另一种语言,我只需要剥离它。

这是一个荒谬的 3 线:

file={"p1.txt","p2.txt","p1.txt"}
find={"<search>","</search>,"<xml>"}
count=1
foreachline in file[count] print line to file[count]
if find[count] in line then count++

或类似的。如果没有 1000 种方式/样式的脚本,我可以自己解决这个问题。只是觉得一些裂缝会给它一分钟。

【问题讨论】:

  • 您必须更精确地处理文件内容。最好举个例子。
  • 您能否更明确地说明您想使用哪种编程或脚本语言?在哪个操作系统上?
  • 这应该尽可能笼统。我有win7 64位。应该是dos类型的批处理脚本。更新操作!!!
  • 我想这是你的第一个 BAT 脚本。要掌握它的语法,请从简短的教程开始。谷歌“windows批处理教程”,阅读并开始学习。然后回来提出您的问题,我们很乐意为您解答。
  • 为了避免在特殊字符等方面过于容易出错,我无法获得任何 dos-type 批处理脚本(更不用说 3-liner)来轻松执行此类多在没有一点帮助的情况下解析 XML 文档的行 XML 元素,例如,来自我提到并链接到的工具。它有一个免费的社区版,不需要许可证密钥代码并且可以免版税使用,并且可以在 32 位和 64 位版本的 Windows 上使用。这是你的电话......

标签: batch-file copy find lines


【解决方案1】:

我认为带有 CLI 的 XSLT 处理器是这​​里最合适的工具。 AltovaXML2011 是我现在使用频率最高的。

然后脚本可以是这样的,将script 元素的内容提取到您的 Original_script 文件中,然后更新您的原始文件:

@echo off
set orig="D:\Original.txt"
set script="D:\Original_script.txt"
set backup="D:\Original_backup.txt"
set xsltprocessor="D:\AltovaXML.exe"
move %orig% %backup%
::extract scripts
%xsltprocessor% -xslt1 "D:\ExtractScripts.xslt" -in %backup% -out %script%
::update original
%xsltprocessor% -xslt1 "D:\UpdateOriginal.xslt" -in %backup% -out %orig%
::del %backup%

ExtractScripts.xslt 看起来像这样,它提取所有 script 元素的内容(添加换行符):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates select="//script"/>
    </xsl:template>
    <xsl:template match="//script">
        <xsl:apply-templates/>
        <xsl:text>
</xsl:text>
    </xsl:template>
</xsl:stylesheet>

UpdateOriginal.xslt 看起来像这样,它只是复制整个原始文件,但忽略了所有 script 元素的内容(已经单独提取):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//script">
        <xsl:copy/>
    </xsl:template>
</xsl:stylesheet>

之后您可以选择保留或删除备份文件。

【讨论】: