2017-10-11 2 views
0

je dois utiliser Batch pour vérifier le fichier Directory.twml pour voir si elle contient des mots de fichier blocked.twml et si elle ne remplace avec [bloqué]Lot trouver du texte dans le fichier et le remplacer par un autre texte

ici est un exemple des deux fichiers:

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 

Ce que je veux dire Directory.twml ressembler est

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. 

Je peux déjà utiliser Findstr pour regarder dans le fichier et voir si le texte existe mais c'est aussi loin que je peux obtenir, je dois pas vérifier un mot set mais il faut vérifier la liste des mots dans le fichier Blocked.twml

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

aussi je peux supprimer le mot du fichier, mais je veux le remplacer pas simplement supprimer

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 

mais encore une fois cette est un texte fixe de chercher non de ce qui est dans un fichier comme une liste

Si Directory.twml contient quoi que ce soit dans Blocked.twml remplacer par [bloqué] mais je ne peux pas comprendre comment le faire

===== ==== Modifier ===========

Ceci est la solution:

(
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 

Sa sortie ressemblait pour moi

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

s'il vous plaît ne pas mettre une réponse à la question (alors techniquement sans aucun doute plus). [Lire ceci] (https://stackoverflow.com/help/someone-answers) – Stephan

+0

Ceci n'est pas un commentaire d'enseignement c'est une demande; Veuillez accepter la réponse de @ Stephan car votre message indique clairement que vous l'avez fait! – Compo

Répondre

0

Lire Directory.twml ligne par ligne. Pour chaque ligne, lisez blocked.twml et remplacez chaque mot par la chaîne [Blocked]. Écho la ligne changée. Rediriger la sortie entière à un nouveau fichier:

@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 

Je vais laisser à vous de renommer le nouveau fichier au nom d'origine.

Remarque: quelque chose comme abadad sera remplacé par a[Blocked]ad. Vous pouvez remplacer set "line=!line:%%B=[Blocked]!" par set "line=!line: %%B = [Blocked] !" pour intercepter les limites de mots, mais This is bad, I think. ne sera pas modifié.

Remarque: un seul ! sera supprimé. S'il y a plus d'un ! dans une ligne, le texte entre eux disparaîtra. Batch n'est pas vraiment un bon choix pour faire de telles choses ...

+0

qui a fonctionné merci exactement ce dont j'avais besoin, et je sais que ce n'est probablement pas le meilleur moyen, mais je suis limité à l'utilisation de lots ici pour cela. cela fonctionne exactement comme il se doit. mis à jour ma question pour l'inclure –

+0

Je vois ce que tu veux dire au sujet du remplacement du milieu des mots, le fichier de filtre que j'ai de google a l'enfer pour le salut remplace à [Bloqué] o –

0
  1. simplement 1 ligne de commande, en utilisant msr.exe pour remplacer le texte dans Directory.twmlsi elle est remplaçable:

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

  • manière plus sûre si Blocked.twml a des lignes blancs et les échapper:

    for /f "tokens=*" %a in ('msr -p Blocked.twml -t "\w+" -PAC') do @msr -p Directory.twml -i -x "%a" -o "[Blocked]" -R Résultat comme: Replace-file-method

2.Dans Directory.twml ne doit pas être remplacé, utilisez les méthodes suivantes en fonction de vos objectifs comme:

  • Vous pouvez copier Directory.twml dans un fichier tmp et l'utilisation que Fichier tmp dans la commande ci-dessus.
  • Si vous voulez juste afficher la ligne remplacé, sans fichier remplaçant:

    • Utilisez -O pour juste vous montrer apparié/remplacé résultat de la commande:

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

    • utilisation -O -P -A pour montrer pur résultat remplacé: (ajouter -C si vous ne voulez pas la couleur)

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

    Résultat comme: just-replace-text-not-file msr.exe/msr.gcc* est un outil exe unique et portable à propos 1.6MB sans dépendances et avec les versions multiplateformes, pour rechercher et remplacer le texte de fichiers avec des couleurs et des informations de synthèse et de sauvegarde support, etc. voir mon projet ouvert https://github.com/qualiu/msr (répertoire tools), docs comme utilisation, comparaison de performance avec findstr et grep; doc intégré comme: https://qualiu.github.io/msr/usage-by-running/msr-Windows.html