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

Мне нужно использовать пакет для проверки файла Directory.twml, чтобы увидеть, содержит ли он какие-либо слова из файла заблокированного.twml и заменяет ли он на [Blocked]

Вот пример обоих файлов:

Directory.twml

11:38:38.90 [System] Twml Has joined the chat.
11:38:41.17 [User]   Twml says: line one
11:38:42.96 [User]   Twml says: line bad two
11:38:46.27 [User]   Twml says: line three
11:38:50.16 [User]   Twml says: you get the idea here
11:38:52.35 [System] Twml Has logged off.

Заблокировано.twml

word1
word2
word3
bad
word5
word6

Я хочу, чтобы Directory.twml выглядел так:

11:38:38.90 [System] Twml Has joined the chat.
11:38:41.17 [User]   Twml says: line one
11:38:42.96 [User]   Twml says: line [Blocked] two
11:38:46.27 [User]   Twml says: line three
11:38:50.16 [User]   Twml says: you get the idea here
11:38:52.35 [System] Twml Has logged off.

Я уже могу использовать Findstr, чтобы просмотреть файл и посмотреть, существует ли текст, но это, насколько я могу, мне нужно не проверять заданное слово, а проверять список слов в файле Blocked.twml.

findstr /i "bad" <"Directory.twml" 1>nul

Также я могу удалить слово из файла, но я хочу заменить его, а не просто удалить

findstr /i /v /c:"%text%" Directory.twml > "Directory.twmll" 2>nul 
del Directory.twml /s /a >nul
copy Directory.twmll Directory.twml >nul
attrib +h Directory.twml
del Directory.twmll /s /a >nul

Но опять же это заданный текст искать не из того что в файле как список

Если Directory.twml содержит что-либо в Blocked.twml, замените на [Blocked], но я не могу понять, как это сделать.

========= Редактировать ===========

Это решение:

(
for /f "delims=" %%A in (Directory.twml) do (
set "line=%%A"
for /f "delims=" %%B in (blocked.twml) do set "line=!line: %%B = [Blocked] !"
echo !line!
)
)>Directory.new

Его вывод выглядел так для меня

13:22:14.16 [User]   twml says: this is a test
13:22:20.37 [User]   twml says: this is a [Blocked] word test

person Twml    schedule 11.10.2017    source источник
comment
пожалуйста, не вкладывайте ответ в вопрос (тогда технически это больше не вопрос). Читать это   -  person Stephan    schedule 11.10.2017
comment
Это не обучающий комментарий, это просьба; Пожалуйста, примите ответ @Stephan, потому что ваш пост ясно указывает на то, что у вас есть!   -  person Compo    schedule 11.10.2017


Ответы (2)


Прочитайте Directory.twml построчно. Для каждой строки прочитайте block.twml и замените каждое слово строкой [Blocked]. Повторить измененную строку. Перенаправить весь вывод в новый файл:

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION
(
  for /f "delims=" %%A in (Directory.twml) do (
    set "line=%%A"
    for /f "delims=" %%B in (blocked.twml) do set "line=!line:%%B=[Blocked]!"
    echo !line!
  )
)>Directory.new

Я оставлю вам возможность переименовать новый файл в исходное имя.

Примечание: что-то вроде abadad будет изменено на a[Blocked]ad. Вы можете изменить set "line=!line:%%B=[Blocked]!" на set "line=!line: %%B = [Blocked] !", чтобы уловить границы слов, но тогда This is bad, I think. не изменится.

Примечание: single! будет удален. Если в строке больше одного !, текст между ними исчезнет. Пакетная обработка не лучший выбор для таких вещей...

person Stephan    schedule 11.10.2017
comment
это сработало, спасибо, именно то, что мне было нужно, и я знаю, что это, вероятно, не лучший способ, но я ограничен только использованием пакета здесь для этого. хотя он работает именно так, как должен. обновил мой вопрос, чтобы включить его - person Twml; 11.10.2017
comment
Я понимаю, что вы имеете в виду, говоря о замене середины слов, в файле фильтра, который у меня есть от Google, есть черт возьми, но привет заменяется на [Blocked]o - person Twml; 11.10.2017

  1. Просто 1 командная строка, используя msr.exe для замены текста в Directory.twml если он заменяемый:

for /f "tokens=*" %a in (Blocked.twml) do @msr -p Directory.twml -i -x "%a" -o "[Blocked]" -R

  • Более безопасный способ, если Blocked.twml имеет пробельные строки и экранирует их:

    for /f "tokens=*" %a in ('msr -p Blocked.twml -t "\w+" -PAC') do @msr -p Directory.twml -i -x "%a" -o "[Blocked]" -R Результат вида: Заменить-файл-метод

2. Если Directory.twml не следует заменять, используйте следующие методы в соответствии с вашими целями, например:

  • Вы можете скопировать Directory.twml в файл tmp и использовать этот файл tmp в приведенной выше команде.
  • Если вы хотите просто отобразить замененную строку, не заменяя файл:

    • Use -O to just show matched/replaced command result:

    for /f "tokens=*" %a in (Blocked.twml) do @msr -p Directory.twml -x "%a" -o "[Blocked]" -O

    • Используйте -O -P -A, чтобы показать чистый результат замены: (добавьте -C, если вам не нужен цвет)

    for /f "tokens=*" %a in (Blocked.twml) do @msr -p Directory.twml -x "%a" -o "[Blocked]" -OPA

    Результат вида: just-replace-text-not-file msr.exe / msr.gcc* — это единый переносимый исполняемый инструмент размером около 1,6 МБ без зависимостей и с кроссплатформенными версиями для поиска и замены текста файла цветом и сводная информация и поддержка резервного копирования и т. д. см. мой открытый проект https://github.com/qualiu/msr (каталог tools), такие документы, как использование, сравнение производительности с findstr и grep; встроенный документ, например: https://qualiu.github.io/msr/usage-by-running/msr-Windows.html

person Quanmao    schedule 12.10.2017