Board logo

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

作者: 屡败屡战    时间: 2018-8-1 17:49     标题: 【已解决】批处理怎样根据关键词列表,将文本中包含“关键词”的“行”进行标注?

本帖最后由 屡败屡战 于 2018-8-4 13:47 编辑

我有一个“关键词列表 list.txt”,文件内容是关键词,一行一个。我想在当前文件夹(包含孑文件夹)进行搜索,
若文件夹里的文件的文本内容中包含“关键词”的“”,就在其行前植入一个“”字符(以此作为标记)
作者: 屡败屡战    时间: 2018-8-2 19:35

请问,有哪位大绅见过这样的问题吗?
作者: WHY    时间: 2018-8-2 22:34

  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
复制代码

作者: WHY    时间: 2018-8-2 22:37

本帖最后由 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'
复制代码

作者: WHY    时间: 2018-8-3 11:46

本帖最后由 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

在此表示感谢论坛老师们的帮助,谢谢了!!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2