标题: [文本处理] 【已解决】批处理怎样根据关键词列表,将文本中包含“关键词”的“行”进行标注? [打印本页]
作者: 屡败屡战 时间: 2018-8-1 17:49 标题: 【已解决】批处理怎样根据关键词列表,将文本中包含“关键词”的“行”进行标注?
本帖最后由 屡败屡战 于 2018-8-4 13:47 编辑
我有一个“关键词列表 list.txt”,文件内容是关键词,一行一个。我想在当前文件夹(包含孑文件夹)进行搜索,
若文件夹里的文件的文本内容中包含“关键词”的“行”,就在其行前植入一个“¥”字符(以此作为标记)
作者: 屡败屡战 时间: 2018-8-2 19:35
请问,有哪位大绅见过这样的问题吗?
作者: WHY 时间: 2018-8-2 22:34
- @echo off
-
- rem 存放关键词的列表文件:List.txt,与批处理位于同一目录
- set "ListFile=%~dp0List.txt"
-
- for /f "delims=" %%i in ('dir /b /s *.txt ^| find /i /v "%ListFile%"') do (
- setlocal enabledelayedexpansion
- for /f "delims=:" %%j in ('findstr /n /i /g:"%ListFile%" "%%i"') do set "_%%j=¥"
-
- (for /f "delims=" %%j in ('findstr /n .* "%%i"') do (
- set "s=%%j"
- for /f "delims=:" %%k in ("%%j") do (echo;!_%%k!!s:*:=!)
- )) > "%%i.Log"
-
- endlocal
- rem move "%%i.Log" "%%i"
- )
-
- pause
复制代码
作者: WHY 时间: 2018-8-2 22:37
本帖最后由 WHY 于 2018-8-3 11:34 编辑
PowerShell 脚本,思路完全相同,优点是可以同时处理不同编码的文件- $MyPath = $MyInvocation.MyCommand.Path -replace '[^\\]+$'; #脚本路径
- $ListFile = $MyPath + 'List.txt'; #存放关键词的列表文件
-
- $key = type $ListFile | ?{ ![String]::IsNullOrEmpty($_) }; #关键词数组
- $arr = dir -Path $MyPath -Include *.txt -Recurse | ?{ $_.FullName -ne $ListFile };
- $Len = $arr.Count;
-
- For($i=0; $i -lt $Len; $i++) {
- $file = $arr[$i].FullName;
- $hash = @{};
- $n = 0;
-
- Select-String -Path $file -Pattern $key -SimpleMatch -Encoding Default | %{
- $Line = ($_ -split ':')[2]; #关键词所在的行数
- $hash[$Line] = '¥'; #赋值哈希表
- }
-
- $txt = type $file | %{ $hash['' + (++$n)] + $_ }; #加标记
- #sc -Path ($file + '.Log') -Value $txt; #写入文本
- $txt
- }
-
- Read-Host 'Done'
复制代码
作者: WHY 时间: 2018-8-3 11:46
本帖最后由 WHY 于 2018-8-4 15:49 编辑
bat + js- @if(0)==(0) echo off
- dir /b /s *.txt | find /i /v "%~dp0List.txt" | cscript //nologo //e:jscript "%~f0"
- pause & goto :EOF
- @end
-
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var s = '';
- var f = fso.OpenTextFile('List.txt', 1);
-
- while(!f.AtEndOfStream){
- var strLine = f.ReadLine();
- if(strLine != '') s += '|' + strLine.replace(/[\\|+.^$*?()[{]/g, '\\$&');
- }
-
- var reg = new RegExp('^.*(' + s.substr(1) + ')', 'gm');
-
- while(!WSH.StdIn.AtEndOfStream){
- var strFile = WSH.StdIn.ReadLine();
- var str = fso.OpentextFile(strFile, 1).ReadAll().replace(reg, '¥$&');
- fso.OpenTextFile(strFile + '.Log', 2, 1).Write(str);
- }
复制代码
改一下,/-]} 这四个字符不需要转义
作者: 屡败屡战 时间: 2018-8-4 13:48
在此表示感谢论坛老师们的帮助,谢谢了!!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |