Board logo

标题: [文本处理] 根据一个文本列出的字符串/行内容,排除/去掉/删除另一个文本相同的内容/提取不同内容 [打印本页]

作者: freesoft00    时间: 2015-3-24 13:53     标题: 根据一个文本列出的字符串/行内容,排除/去掉/删除另一个文本相同的内容/提取不同内容

本帖最后由 pcl_test 于 2017-4-13 09:29 编辑

批处理命令findstr完全匹配,过滤内容来自文件
1.txt的内容
C:\Autoruns.13.02.chs.th_sjy.exe
C:\Program Files\Autoruns.13.02.chs.th_sjy.exe
D:\Autoruns.13.02.chs.th_sjy.exe
D:\ss\Autoruns.13.02.chs.th_sjy.exe
D:\TMACv6.0.6_Setup\Autoruns.13.02.chs.th_sjy.exe
D:\tt\Autoruns.13.02.chs.th_sjy.exe
G:\Autoruns.13.02.chs.th_sjy.exe

2.txt的内容
D:\ss\Autoruns.13.02.chs.th_sjy.exe

想把2.txt包含的内容作为排除想,把1.txt种包括的过滤掉,不区分大小写,全路径配备,
如果2.txt的内容里面包括只有路径没有文件名称的排除项,也希能匹配到路径(这两个过滤可以分开也可以是一个方案解决也可以)

我写的一个:
  1. findstr /irbvG:"2.txt" 1.txt>>1.txt
复制代码
但是代码不对,达不到效果
作者: DAIC    时间: 2015-3-24 15:36

findstr命令不靠谱,推荐使用grep命令:
  1. grep -ivxFf 2.txt 1.txt > 3.txt
复制代码

作者: cobat    时间: 2015-3-24 15:41

把r改成l
  1. findstr /ilbvG:"2.txt" 1.txt>>1.txt
复制代码

作者: freesoft00    时间: 2015-3-24 15:52

回复 2# DAIC


    谢谢,主要是不想用第三方软件了,还得下载,这个自带,如果第二条无法满足,那么能满足第一条也可以
想把2.txt包含的内容作为排除想,把1.txt种包括的过滤掉,不区分大小写,全路径配备,

作者: freesoft00    时间: 2015-3-24 15:57

回复 3# cobat


    这个好像是可以了。
作者: freesoft00    时间: 2015-3-25 02:16

回复 3# cobat


    还是不行。
排除的文件路径中有空格达不到排除的效果。其文本内容如下:
  1. C:\WINDOWS\system32\config\systemprofile\Local Settings\Temporary Internet Files\Content.IE5\2N04V8MU\desktop.ini
  2. C:\WINDOWS\system32\config\systemprofile\Local Settings\Temporary Internet Files\Content.IE5\7XEV1GUV\desktop.ini
  3. C:\WINDOWS\system32\config\systemprofile\Local Settings\Temporary Internet Files\Content.IE5\BTLVJPL2\desktop.ini
  4. C:\WINDOWS\system32\config\systemprofile\Local Settings\Temporary Internet Files\Content.IE5\ZJ4R5M2P\desktop.ini
  5. C:\WINDOWS\system32\config\systemprofile\「开始」菜单\desktop.ini
  6. C:\WINDOWS\system32\config\systemprofile\「开始」菜单\程序\desktop.ini
  7. C:\WINDOWS\system32\config\systemprofile\「开始」菜单\程序\附件\desktop.ini
复制代码

作者: apang    时间: 2015-3-25 09:23

一定要用 findstr 的话,这样试下:
  1. @echo off
  2. (for /f "delims=" %%a in (2.txt) do (
  3.         set "s=%%a"
  4.         setlocal enabledelayedexpansion
  5.         echo,!s:\=\\!
  6.         endlocal
  7. ))>$
  8. more 1.txt|findstr /irxvg:$>3.txt
  9. del $
  10. pause
复制代码

作者: freesoft00    时间: 2015-3-25 21:34

回复 7# apang


    findstr过滤的项目是不是有字节限制,提示这样:
FINDSTR: 搜索字符串太长
作者: cobat    时间: 2015-3-25 21:44

本帖最后由 cobat 于 2015-3-25 23:41 编辑
回复  cobat


    还是不行。
排除的文件路径中有空格达不到排除的效果。其文本内容如下:
freesoft00 发表于 2015-3-25 02:16


    我这里可以
作者: apang    时间: 2015-3-25 23:17

回复 9# cobat


    楼主的意思好像是2.txt含中文字符时不行
作者: apang    时间: 2015-3-25 23:21

本帖最后由 apang 于 2015-3-25 23:29 编辑

好吧,7#仅仅转义斜杠字符不行,其它特殊字符也得转义,蛋疼

直接vbs好了
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. Set file = fso.OpentextFile("1.txt")
  3. s = fso.OpenTextFile("2.txt").ReadAll
  4. s = vbCrLf & LCase(s) & vbCrLf
  5. while Not file.AtEndOfStream
  6.         s1 = file.ReadLine
  7.         If InStr(s, vbCrLf & LCase(s1) & vbCrLf) = 0 Then
  8.                  s2 = s2 & s1 & vbCrLf
  9.         End If
  10. wend
  11. fso.OpentextFile("3.txt", 2, true).Write s2
复制代码

作者: cobat    时间: 2015-3-25 23:22

回复 10# apang


    还是你对
作者: freesoft00    时间: 2015-3-25 23:36

应该这样也可以把,文本去重,我看到原来论坛中有文本去重的批处理。
第一步读取文本2。
第二部读取文本1中不包括文本2的内容,然后导出其值到文本3,
第三部然后合并文本2的内容到导出的文本3中。
因为我的问题是排除,所以不用第三部就可以了。

如果方便请给出具体的代码。
这样就不用findstr了。
作者: freesoft00    时间: 2015-3-25 23:40

文本中有空格,有斜杠,有中文字符,就是符合路径和文件名的都可以有。
作者: pcl_test    时间: 2015-3-25 23:45

本帖最后由 pcl_test 于 2015-3-25 23:48 编辑

回复 8# freesoft00
findstr单条关键词上限255,find似乎没有上限
  1. @echo off
  2. set a=1
  3. set n=1
  4. :loop
  5. findstr "%a%" %0 >nul
  6. echo %n%
  7. echo findstr "%a%"
  8. set a=%a%1
  9. set /a n+=1
  10. goto loop
复制代码
  1. @echo off
  2. set a=1
  3. set n=1
  4. :loop
  5. find "%a%" %0 >nul
  6. echo %n%
  7. echo find "%a%"
  8. set a=%a%1
  9. set /a n+=1
  10. goto loop
复制代码

作者: CrLf    时间: 2015-3-26 00:24

回复 12# cobat


    中文真是个痛点
作者: pcl_test    时间: 2015-3-26 11:20

回复 6# freesoft00
  1. @echo off & setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('type "1.txt"') do (
  3. set n=0
  4. for /f "delims=" %%b in ('type "2.txt"') do (
  5. if "%%a" equ "%%b" set n=1
  6. )
  7. if !n! neq 1 echo,%%a
  8. ))>"3.txt"
  9. ::move "3.txt" "1.txt"
  10. pause
复制代码

作者: freesoft00    时间: 2015-3-26 11:36

谢谢各位了!




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