标题: [文本处理] 请教批处理如何替换文本末尾最后的几个字符? [打印本页]
作者: sajk1 时间: 2017-1-12 07:49 标题: 请教批处理如何替换文本末尾最后的几个字符?
请教,我想把当前文件夹中“1.txt”的倒数第1个字符改为a、倒数第2个字符改为b,另存为“2.txt”在当前文件夹中,该怎么写批处理?
作者: taofan712 时间: 2017-2-10 16:18
本帖最后由 taofan712 于 2017-2-13 09:41 编辑
放着我来!- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do set num=%%a
- for /f "tokens=1* delims=:" %%b in ('findstr /n .* 1.txt') do (
- set str=%%c
- set /a n+=1
- if not "!n!"=="%num%" (
- echo;!str!>>2.txt
- ) else (
- echo;!str:~0,-2!ba>>2.txt )
- )
复制代码
作者: taofan712 时间: 2017-3-2 00:37
本帖最后由 taofan712 于 2017-3-2 22:57 编辑
此题应有更简洁的答法,mark一下,明日再战!
再 GNU前辈的指导下,代码可以缩减成这样:- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do set "ln=%%a" &set "last=%%b"
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do if %%a neq %ln% (echo;%%b) else (echo;!last:~0,-2!ba ))>>2.txt
复制代码
作者: Nsqs 时间: 2017-3-2 11:46
本帖最后由 Nsqs 于 2017-3-2 12:05 编辑
- ' 2>nul&cls&type a.txt|cscript -nologo -e:"vbs" "%~0"&pause&exit
- read=wsh.stdin.readall
- wsh.echo left(read,len(read)-2) & "ba"
复制代码
- @echo off
- for /f "delims=" %%1 in (a.txt)do (
- set /a n+=1
- call set #_%%n%%=%%1
- )
- call set #_%%n%%=%%#_%n%%:~,-2%%ba
- for /l %%1 in (1 1 %n%)do call echo %%#_%%1%%
- pause
复制代码
作者: pcl_test 时间: 2017-3-2 11:55
- //&cls&cscript -nologo -e:jscript "%~f0"<"文本.txt"&pause&exit
- WSH.Echo(WSH.StdIn.ReadAll().replace(/[^\r\n]([\r\n]*)[^\r\n][\r\n]*?$/, 'b$1a'))
复制代码
作者: taofan712 时间: 2017-3-2 13:43
本帖最后由 taofan712 于 2017-3-2 13:45 编辑
回复 4# Nsqs
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('findstr .* a.txt^|find /v /c ""') do set /a ln=%%a,n=1
- echo;%ln%&pause
- for /f "tokens=1* delims=:" %%b in ('findstr /n .* a.txt') do set last=%%c
- echo;%last%&pause
- for /f "tokens=1* delims=:" %%d in ('findstr /n .* a.txt') do (
- if %%d neq %ln% (
- set line=%%e
- echo;!line!
- set /a n+=1
- ) else (
- echo;!last:~0,-2!ba
- )
- )>>2.txt
复制代码
原以为我能写出更简短代码,没想到比我原答案还更多了几行。。。
作者: Nsqs 时间: 2017-3-2 15:09
回复 6# taofan712
在批处理中for里面尽量少调用例如findstr外部程序,每次读写都会启动findstr程序,在读取大文本数据用for读会很慢很慢的,代码就会变得不实用了
作者: WHY 时间: 2017-3-2 15:40
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in (1.txt) do (
- if defined s echo;!s!
- set "s=%%i"
- )
- echo;!s:~0,-2!ss
复制代码
不考虑最后一行不够2字符的情况
作者: GNU 时间: 2017-3-2 22:33
- sed "$s/..$/ba/" 1.txt > 2.txt
复制代码
作者: GNU 时间: 2017-3-2 22:48
回复 6# taofan712
你这个代码可以这样优化:
1、获取文件行数和获取尾行内容,两个操作可以合并到一个for循环里面。
2、最后一个for循环里面直接输出变量的值,没有必要写成三行:
set line=%%e
echo;!line!
set /a n+=1- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do (
- set "ln=%%a"
- set "last=%%b"
- )
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do (
- if %%a neq %ln% (
- echo;%%b
- ) else (
- echo;!last:~0,-2!ba
- )
- ))>2.txt
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |