2017-10-11 171 views
0

我需要使用批处理来检查文件Directory.twml,看它是否包含文件blocked.twml任何文字取代,如果它确实与[锁定]批处理文件中查找文本与其他文本

这里更换是这两个文件的一个例子:

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. 

Blocked.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任何替换[锁定]但我无法弄清楚如何做到这一点

===== ====编辑===========

这是解决方案:

(
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 
+0

请不要回答问题(然后它在技术上没有问题了)。 [阅读此](https://stackoverflow.com/help/someone-answers) – Stephan

+0

这不是一个教学评论它是一个请求;请接受@ Stephan的回答,因为你的帖子清楚地表明你有! – Compo

回答

0

逐行读取Directory.twml。对于每行,请阅读blocked.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.

注意:单个!将被删除。如果一行中有多个!,它们之间的文本将消失。批处理并不是一个很好的选择去做这样的事情......

+0

工作,谢谢你正是我需要的,我知道它可能不是最好的方式,但我只限于在这里使用批处理。它的工作原理与它应该一样。更新我的问题,包括它 –

+0

我明白你的意思,虽然有关替换词的中间,我从谷歌有过滤器文件有地狱在你好替换到[阻止]○ –

0
  1. 只需1个命令行,使用msr.exeDirectory.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 结果一样: Replace-file-method

2.如果Directory.twml不应该被取代,使用根据自己的目的,如下面的方法:

  • 您可以复制Directory.twml到tmp文件,并使用该tmp文件在上面的命令中。
  • 如果你想只是为了显示代替的线路,而无需替换文件:

    • 使用-O到只显示匹配/替换命令结果:

    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.6MB单和便携式exe文件的工具,而不依赖关系和跨平台的版本,找到并用颜色和汇总信息和备份替换文件中的文本支持等看到我的开放项目https://github.com/qualiu/msrtools目录),docs使用情况,性能比较findstrgrep;内置文档如:https://qualiu.github.io/msr/usage-by-running/msr-Windows.html

相关问题