批处理脚本删除多个文件中的特定行
Batch script deleting specific lines in multiple files
我正在寻找可以从文本文件 ( input.001.log.....input.log.1900) 中删除特定行的脚本或程序,这些文件有 50MB大小,我有大约 2k 个文件。每行都有一个字符串,我想删除每行有双字符 "aa" "bb" 等等,还有每行超过 5 个数字,每行有一个特殊字符除了 @ # &以及超过 2 个特殊字符的每一行(如 a@bcd#38s# 这一行需要删除)
请注意,我没有任何编程技能,只有一点批处理脚本经验。
到目前为止,我正在使用此代码:
@ECHO OFF
SETLOCAL
FOR %%i IN (input.txt) DO (
TYPE "%%i"|FINDstr /l /v "aa bb cc dd ff gg hh ii jj kk ll mm nn pp qq rr ss tt uu vv xx yy zz" >"input_1.txt"
)
GOTO :EOF
如果批处理有一个不错的正则表达式实用程序,这会很容易,但是 FINDSTR is extremely limited and buggy。然而,FINDSTR 可以相当有效地解决这个问题,没有太大的困难。
你不是很清楚"special character"是什么意思。我的解释是您只想接受字母字符 a-z
和 A-Z
、数字 0-9
和特殊字符 @
、#
和 &
.我只能猜测您正在构建一个潜在密码字典。
如果您构建表示各种 类 字符以及各种逻辑表达式的环境变量,然后在搜索字符串中使用这些变量,我发现这个问题会更容易。
我建议您将修改后的文件写入新文件夹。
@echo off
setlocal
set "alpha=abcdefghijklmnopqrstuvwxyz"
set "num=0123456789"
set "sym=@#&"
set "dups=aa bb cc dd ee ff gg hh ii jj kk ll mm nn oo pp qq rr ss tt uu vv ww xx yy zz 00 11 22 33 44 55 66 77 88 99 @@ ## &&"
set "bad=[^%alpha%%num%%sym%]"
set "num6=[%num%][^%num%]*[%num%][^%num%]*[%num%][^%num%]*[%num%][^%num%]*[%num%][^%num%]*[%num%]"
set "sym3=[%sym%][^%sym%]*[%sym%][^%sym%]*[%sym%]
set "source=c:\your\source\folder"
set "destination=c:\your\destination\folder"
for %%F in ("%source%\*.txt") do findstr /riv "%dups% %bad% %num6% %sym3%" "%%F" >"%destination%\%%~nxF"
根据 Magoo 的评论进行编辑
如果您在 Windows XP 上 运行,解决方案必须稍微修改一下,因为它的正则表达式长度限制为 127 个字节,而 %num6%
表达式超过了该限制限制。
如果将 num6 更改为
,该解决方案应该适用于 XP
set "num6=[%num%].*[%num%].*[%num%].*[%num%].*[%num%].*[%num%]"
该搜索在逻辑上给出了相同的结果,但效率明显较低,因为在匹配过程中可能需要过多的回溯。
我正在寻找可以从文本文件 ( input.001.log.....input.log.1900) 中删除特定行的脚本或程序,这些文件有 50MB大小,我有大约 2k 个文件。每行都有一个字符串,我想删除每行有双字符 "aa" "bb" 等等,还有每行超过 5 个数字,每行有一个特殊字符除了 @ # &以及超过 2 个特殊字符的每一行(如 a@bcd#38s# 这一行需要删除)
请注意,我没有任何编程技能,只有一点批处理脚本经验。
到目前为止,我正在使用此代码:
@ECHO OFF
SETLOCAL
FOR %%i IN (input.txt) DO (
TYPE "%%i"|FINDstr /l /v "aa bb cc dd ff gg hh ii jj kk ll mm nn pp qq rr ss tt uu vv xx yy zz" >"input_1.txt"
)
GOTO :EOF
如果批处理有一个不错的正则表达式实用程序,这会很容易,但是 FINDSTR is extremely limited and buggy。然而,FINDSTR 可以相当有效地解决这个问题,没有太大的困难。
你不是很清楚"special character"是什么意思。我的解释是您只想接受字母字符 a-z
和 A-Z
、数字 0-9
和特殊字符 @
、#
和 &
.我只能猜测您正在构建一个潜在密码字典。
如果您构建表示各种 类 字符以及各种逻辑表达式的环境变量,然后在搜索字符串中使用这些变量,我发现这个问题会更容易。
我建议您将修改后的文件写入新文件夹。
@echo off
setlocal
set "alpha=abcdefghijklmnopqrstuvwxyz"
set "num=0123456789"
set "sym=@#&"
set "dups=aa bb cc dd ee ff gg hh ii jj kk ll mm nn oo pp qq rr ss tt uu vv ww xx yy zz 00 11 22 33 44 55 66 77 88 99 @@ ## &&"
set "bad=[^%alpha%%num%%sym%]"
set "num6=[%num%][^%num%]*[%num%][^%num%]*[%num%][^%num%]*[%num%][^%num%]*[%num%][^%num%]*[%num%]"
set "sym3=[%sym%][^%sym%]*[%sym%][^%sym%]*[%sym%]
set "source=c:\your\source\folder"
set "destination=c:\your\destination\folder"
for %%F in ("%source%\*.txt") do findstr /riv "%dups% %bad% %num6% %sym3%" "%%F" >"%destination%\%%~nxF"
根据 Magoo 的评论进行编辑
如果您在 Windows XP 上 运行,解决方案必须稍微修改一下,因为它的正则表达式长度限制为 127 个字节,而 %num6%
表达式超过了该限制限制。
如果将 num6 更改为
,该解决方案应该适用于 XPset "num6=[%num%].*[%num%].*[%num%].*[%num%].*[%num%].*[%num%]"
该搜索在逻辑上给出了相同的结果,但效率明显较低,因为在匹配过程中可能需要过多的回溯。