2017-10-11 116 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

相關問題