找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26242|回复: 5

[文本处理] 【已解决】批处理怎样根据关键词列表,将文本中包含“关键词”的“行”进行标注?

[复制链接]
发表于 2018-8-1 17:49:25 | 显示全部楼层 |阅读模式
本帖最后由 屡败屡战 于 2018-8-4 13:47 编辑

我有一个“关键词列表 list.txt”,文件内容是关键词,一行一个。我想在当前文件夹(包含孑文件夹)进行搜索,
若文件夹里的文件的文本内容中包含“关键词”的“”,就在其行前植入一个“”字符(以此作为标记)
 楼主| 发表于 2018-8-2 19:35:30 | 显示全部楼层
请问,有哪位大绅见过这样的问题吗?
发表于 2018-8-2 22:34:23 | 显示全部楼层
  1. @echo off

  2. rem 存放关键词的列表文件:List.txt,与批处理位于同一目录
  3. set "ListFile=%~dp0List.txt"

  4. for /f "delims=" %%i in ('dir /b /s *.txt ^| find /i /v "%ListFile%"') do (
  5.         setlocal enabledelayedexpansion
  6.         for /f "delims=:" %%j in ('findstr /n /i /g:"%ListFile%" "%%i"') do set "_%%j=¥"

  7.         (for /f "delims=" %%j in ('findstr /n .* "%%i"') do (
  8.                 set "s=%%j"
  9.                 for /f "delims=:" %%k in ("%%j") do (echo;!_%%k!!s:*:=!)
  10.         )) > "%%i.Log"

  11.         endlocal
  12.         rem move "%%i.Log" "%%i"
  13. )

  14. pause
复制代码

评分

参与人数 2技术 +2 收起 理由
屡败屡战 + 1 感激涕零!!无以言表!!都不知说什么好了 ...
狄钦dQ + 1 学习了

查看全部评分

发表于 2018-8-2 22:37:51 | 显示全部楼层
本帖最后由 WHY 于 2018-8-3 11:34 编辑

PowerShell 脚本,思路完全相同,优点是可以同时处理不同编码的文件
  1. $MyPath = $MyInvocation.MyCommand.Path -replace '[^\\]+$';   #脚本路径
  2. $ListFile = $MyPath + 'List.txt';                            #存放关键词的列表文件

  3. $key = type $ListFile | ?{ ![String]::IsNullOrEmpty($_) };   #关键词数组
  4. $arr = dir -Path $MyPath -Include *.txt -Recurse | ?{ $_.FullName -ne $ListFile };
  5. $Len = $arr.Count;

  6. For($i=0; $i -lt $Len; $i++) {
  7.     $file = $arr[$i].FullName;
  8.     $hash = @{};
  9.     $n = 0;

  10.     Select-String -Path $file -Pattern $key -SimpleMatch -Encoding Default | %{
  11.         $Line = ($_ -split ':')[2];            #关键词所在的行数
  12.         $hash[$Line] = '¥';                   #赋值哈希表
  13.     }

  14.     $txt = type $file | %{ $hash['' + (++$n)] + $_ };  #加标记
  15.     #sc -Path ($file + '.Log') -Value $txt;             #写入文本
  16.     $txt
  17. }

  18. Read-Host 'Done'
复制代码
发表于 2018-8-3 11:46:08 | 显示全部楼层
本帖最后由 WHY 于 2018-8-4 15:49 编辑

bat + js
  1. @if(0)==(0) echo off
  2. dir /b /s *.txt | find /i /v "%~dp0List.txt" | cscript //nologo //e:jscript "%~f0"
  3. pause & goto :EOF
  4. @end

  5. var fso = new ActiveXObject('Scripting.FileSystemObject');
  6. var s = '';
  7. var f = fso.OpenTextFile('List.txt', 1);

  8. while(!f.AtEndOfStream){
  9.     var strLine = f.ReadLine();
  10.     if(strLine != '') s += '|' + strLine.replace(/[\\|+.^$*?()[{]/g, '\\$&');
  11. }

  12. var reg = new RegExp('^.*(' + s.substr(1) + ')', 'gm');

  13. while(!WSH.StdIn.AtEndOfStream){
  14.     var strFile = WSH.StdIn.ReadLine();
  15.     var str = fso.OpentextFile(strFile, 1).ReadAll().replace(reg, '¥$&');
  16.     fso.OpenTextFile(strFile + '.Log', 2, 1).Write(str);
  17. }
复制代码
改一下,/-]} 这四个字符不需要转义
 楼主| 发表于 2018-8-4 13:48:14 | 显示全部楼层
在此表示感谢论坛老师们的帮助,谢谢了!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:17 , Processed in 0.011278 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表