[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理多行删除或者多行替换如何实现?

  1. @echo off
  2. set "old1=11111"
  3. set "new1="
  4. pushd "%~dp0"
  5. for /f "delims=" %%i in ('dir /b /s /a-d 1.txt') do (
  6. (for /f "delims=" %%a in ('findstr /n .* "%%i"') do (
  7. set "str=%%a"
  8. setlocal enabledelayedexpansion
  9. set "str=!str:%old1%=%new1%!"
  10. echo=!str:*:=!
  11. endlocal
  12. ))>"1.cmd"
  13. move /y "1.cmd" "%%i"
  14. )
  15. pause
复制代码
这段代码 是替换所有的11111为空白

比如我想把1.txt里面的  
11111
22222
33333
44444
这几行都删除  需要怎么写?

回复 1# lovekix
  1. @echo off &setlocal &set "s=/11111/22222/33333/44444/"
  2. (for /f "delims=" %%a in (1.txt) do (
  3.     set "a=%%a" &setlocal enabledelayedexpansion
  4.     if "!s:/%%a/=!"=="!s!" echo,!a!
  5.     endlocal))>2.txt
  6. pause&exit/b
复制代码

TOP

回复 2# aloha20200628




这样分割不行  11111  22222 3333  实际为
  1. <Path>CrossDeviceResumeView.dll</Path>
  2.                 <ActivatableClass ActivatableClassId="CrossDeviceResume.XamlMetaDataProvider" ThreadingModel="both" />
  3.                 <ActivatableClass ActivatableClassId="CrossDeviceResume.CrossDeviceResumeResources" ThreadingModel="both" />
  4.                 <ActivatableClass ActivatableClassId="CrossDeviceResume.CrossDeviceResumeControl" ThreadingModel="both" />
复制代码

TOP

本帖最后由 aloha20200628 于 2025-2-9 13:58 编辑

回复 1# lovekix

二楼代码采用的字符串替换函数对删除行字符不区分大小写,以下再给一个区分字符大小写的版本
例如要处理的 1.txt 内容如下
aaa
aAa
bbb
BBB
ccc
CcC
  1. @echo off &setlocal &(for /f "delims=" %%a in (1.txt) do (
  2.    set "x=" &for %%x in ("aAa","BBB","CcC") do if "%%a"=="%%~x" set "x=1"
  3.    if not defined x echo,%%a
  4. ))>2.txt
  5. pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2025-2-9 20:39 编辑

回复 3# lovekix

一楼的示例样本与实况(包含了等号和双引号)差别很大,须改用以下版本,先将要删除的文本行(例如3楼文本行内容)存为 1.lst 文件,与要处理的 1.txt 文件和本批处脚本文件同目录,另假设 1.txt 和 1.lst 文件均为 ansi 或简中编码;若 1.txt 文件是 utf-8 编码,则要删除的所有文本行中假设不包含中文字符...
  1. @echo off &setlocal &for /f "delims=:" %%a in ('findstr /nxg:"1.lst" 1.txt') do set _#%%a=1
  2. (for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" 1.txt') do if not defined _#%%a echo,%%b)>2.txt
  3. pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2025-2-9 20:00 编辑

回复 3# lovekix

若 1.txt 和 1.lst 文件(例如3楼文本行内容)是 utf-8 编码,而且要删除的文本行中包含中文字符,则须用以下兼容性更强的 bat+powershell 版本,其生成的结果文件 2.txt 亦是 utf-8 编码文件(无BOM标头)..
  1. @echo off &powershell "$w='/'+((gc 1.lst -enc utf8) -join '/')+'/';$v=(gc 1.txt -enc utf8|%%{if(!$w.contains('/'+$_+'/')){$_}});[io.file]::writeAlllines('2.txt',$v)"
  2. pause&exit/b
复制代码

TOP

返回列表