Мне нужно вырезать часть текстового файла и записать его в другой. Удаленный текстовый файл также должен быть сохранен.

Перед:

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 способов/стилей написания сценариев, я бы сам это понял. Просто подумал, что какой-нибудь крэк даст ему минутку.

1
user700994 10 Апр 2011 в 20:16
1
Вам нужно быть более точным с содержимым ваших файлов. Пример будет лучше всего.
 – 
Mat
10 Апр 2011 в 20:19
Не могли бы вы уточнить, какой язык программирования или скриптов вы хотите использовать? И на какой операционной системе?
 – 
Robin Green
10 Апр 2011 в 20:41
Это должно быть как можно более общим. у меня вин7 64бит. должен быть пакетный скрипт типа dos. ОБНОВЛЕНО ОП!!!
 – 
user700994
11 Апр 2011 в 00:08
1
Полагаю, это ваш первый BAT-скрипт. Чтобы понять его синтаксис, начните с краткого руководства. Погуглите "учебник по пакетной обработке Windows", прочитайте и приступайте к изучению. Тогда возвращайтесь со своими вопросами, мы будем рады ответить.
 – 
PA.
11 Апр 2011 в 13:33
Чтобы не быть слишком подверженным ошибкам, связанным со специальными символами и тому подобным, я не мог получить какой-либо пакетный скрипт типа dos (не говоря уже о трехстрочном), чтобы легко выполнять такой многострочный анализ XML-элемента XML document без небольшой помощи, например, из инструмента, о котором я упоминал и на который ссылался. У него есть бесплатная версия Community Edition, которая не требует кода лицензионного ключа и может использоваться без лицензионных отчислений, а также может использоваться как в 32-разрядных, так и в 64-разрядных версиях Windows. Это ваш вызов…
 – 
mousio
11 Апр 2011 в 18:16

1 ответ

Я думаю, что 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>

После этого вы можете сохранить или удалить файл резервной копии.

1
mousio 11 Апр 2011 в 16:38