标题: [文本处理] 【已解决】求BAT脚本替换txt的“连续空白行+非空白行句首空格”为指定数目空白行 [打印本页]
作者: kokoxx 时间: 2024-3-11 09:49 标题: 【已解决】求BAT脚本替换txt的“连续空白行+非空白行句首空格”为指定数目空白行
本帖最后由 kokoxx 于 2024-3-11 16:23 编辑
RT,求大佬出手,写一个替换txt的“连续空白行+非空白行句首空格”的bat
该bat的功能如下
【使用前】
我是奥特曼
我是泰罗
(注:文本内容到此结束)
(注2:上文中“我是泰罗”前面有一个空格,也就是“ 我是泰罗”,但是我这边发帖后显示成“我是泰罗”,但实际应该是“ 我是泰罗”)
【使用后】
我是奥特曼
我是泰罗
(注:文本内容到此结束)
--------
希望bat里要处理的连续空白行数目(x)和连续空白行数目之后的非空白行句首空格数目(y),还有替换后的空白行数目(z),都可以由用户自己在bat源文件里自己指定,也就是做成可以由用户自定义赋值的变量
注:word/wps的确可以实现类似的功能,但处理大体积txt(大于4m)时,会出现卡死和风扇狂转现象……
作者: qixiaobin0715 时间: 2024-3-11 10:07
多个连续空白行合并为一个可使用:复制代码
作者: 77七 时间: 2024-3-11 11:57
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
-
- set /a y=空格=3,x=空白行=2,z=替换行=1
-
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- for /l %%l in (1,1,%y%) do (
- set "l=!l! "
- )
- endlocal & set _y=%l%
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- setlocal
- (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
- if "%%b" equ "" (
- set /a m+=1
- ) else if defined m (
- set str=%%b
- setlocal enabledelayedexpansion
- if !m! equ %x% (
- if "!str:~0,%y%!" equ "%_y%" (
- if "!str:~%y%,1!" neq " " (
- for /l %%l in (1,1,%z%) do (
- echo=
- )
- echo=!str:~%y%!
- endlocal
- set m=
- )
- )
- )
- if defined m (
- for /l %%l in (1,1,!m!) do (
- echo=
- )
- endlocal
- echo=%%b
- set m=
- )
- ) else (
- echo=%%b
- )
- ))>$
- move $ "%%i"
- endlocal
- )
- pause
复制代码
作者: kokoxx 时间: 2024-3-11 16:22
回复 3# 77七
测试通过,多谢大佬!
作者: Five66 时间: 2024-3-11 17:03
不知行否
保存为ansi编码的bat- #?&cls&pause&powershell -c "type -literalpath '%~f0'|out-string|iex"&pause&exit
-
- #空白行数目,0是任意个,n是n个以上
- $x=0
-
- #空格数,0是任意个,n是n个以上
- $y=0
-
- #空白行或空格"n个以上"的最大值,设为0时"n个以上"仅有n个
- $lmt=0
-
- #空白行替换后的行数
- $z=1
-
- #替换后的空格数
- $z2=0
-
- #需要处理的文件名或路径,批量处理时改成获取文件(名)的命令
- $f="aaa.txt"
-
- #文件编码
- $cd="utf8"
-
- #仅匹配空行
- if($lmt -lt $x){$m=$x}else{$m=$lmt}
- if($x -eq 0){$r="\r?\n(\r?\n)+"}else{$r="\r?\n(\r?\n){$x,$m}"}
- if($lmt -lt $y){$m=$y}else{$m=$lmt}
- if($y -eq 0){$r+=" *"}else{$r=$r+" {$y,$m}"}
- $p="`r`n"+"`r`n"*($z-1)+" "*$z2
-
- $f|%{
- $file=[io.fileinfo]$_
- $filepath=$file.DirectoryName+"\_new_"+$file.name
- [regex]::replace([io.file]::ReadAllText($file,$cd),$r,$p)|sc -LiteralPath ($filepath) -Encoding ($cd)
- [console]::writeline("已保存到: "+$filepath)
- }
复制代码
作者: hfxiang 时间: 2024-3-11 17:35
回复 1# kokoxx
可借用第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )来实现:- @echo off&cd /d "%~dp0"
- rem 注意gawk参数:-v"Spaces=4"表示每行给4个前置空格,-v"BlankLines=1"表示每行间空1行
- for /f "delims=" %%i in ('dir /b/s/a-d *.txt') do (
- gawk -v"Spaces=4" -v"BlankLines=1" "BEGIN{if(Spaces<0)Spaces=0;for(i=1;i<=Spaces;i++){S=S OFS};L=ORS;if(BlankLines<0)BlankLines=0;L=ORS;for(i=1;i<=BlankLines;i++){ORS=ORS L}}{sub(/^[ \t]+/,\"\");sub(/[ \t]+$/,\"\");if($0)print S $0}" "%%~i">"%%~dpni.bak"
- move /y "%%~dpni.bak" "%%~i"
- )
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |