返回列表 发帖

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

@echo off
set "old1=11111"
set "new1="
pushd "%~dp0"
for /f "delims=" %%i in ('dir /b /s /a-d 1.txt') do (
(for /f "delims=" %%a in ('findstr /n .* "%%i"') do (
set "str=%%a"
setlocal enabledelayedexpansion
set "str=!str:%old1%=%new1%!"
echo=!str:*:=!
endlocal
))>"1.cmd"
move /y "1.cmd" "%%i"
)
pauseCOPY
这段代码 是替换所有的11111为空白

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

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

TOP

回复 2# aloha20200628




这样分割不行  11111  22222 3333  实际为
<Path>CrossDeviceResumeView.dll</Path>
                <ActivatableClass ActivatableClassId="CrossDeviceResume.XamlMetaDataProvider" ThreadingModel="both" />
                <ActivatableClass ActivatableClassId="CrossDeviceResume.CrossDeviceResumeResources" ThreadingModel="both" />
                <ActivatableClass ActivatableClassId="CrossDeviceResume.CrossDeviceResumeControl" ThreadingModel="both" />COPY

TOP

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

回复 1# lovekix

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

TOP

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

回复 3# lovekix

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

TOP

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

回复 3# lovekix

若 1.txt 和 1.lst 文件(例如3楼文本行内容)是 utf-8 编码,而且要删除的文本行中包含中文字符,则须用以下兼容性更强的 bat+powershell 版本,其生成的结果文件 2.txt 亦是 utf-8 编码文件(无BOM标头)..
@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)"
pause&exit/bCOPY

TOP

返回列表