标题: [文本处理] [已解决]文字txt内文字,批处理如何删除最尾的符号? [打印本页]
作者: skpkmon 时间: 2023-11-27 17:18 标题: [已解决]文字txt内文字,批处理如何删除最尾的符号?
如何bat批量删除最尾的符号?请帮忙,谢谢
作者: ShowCode 时间: 2023-11-27 17:39
回复 1# skpkmon
请选2个txt文件作为例子打包上传到网盘
作者: skpkmon 时间: 2023-11-27 18:44
本帖最后由 skpkmon 于 2023-11-27 18:46 编辑
回复 2# ShowCode
https://vip.123pan.cn/1714872/%E5%88%86%E4%BA%AB/Desktop.rar
作者: Nsqs 时间: 2023-11-27 19:49
powershell -noprofile executionpolicy bypass "(gc 'a.txt') -replace '(.+).$','$1'">b.txt
作者: hfxiang 时间: 2023-11-28 10:13
回复 3# skpkmon
用第3方工具sed( http://bcn.bathome.net/tool/4.9/sed.exe )实现方法如下:
[code]
sed -r "/[ ,.;\t]+$/s///" 原始有符号.txt>删除符号.txt
[code]
作者: ShowCode 时间: 2023-11-28 11:03
回复 1# skpkmon - @echo off
- set "OldFile=1.txt"
- set "NewFile=2.txt"
- cd /d "%~dp0"
- powershell "(Get-Content '%OldFile%') -replace '[,.;!]+$'" >"%NewFile%"
复制代码
作者: qixiaobin0715 时间: 2023-11-28 11:21
本帖最后由 qixiaobin0715 于 2023-11-28 14:44 编辑
如果还有别的符号可在第4行后面按照第4行的方式添加即可:- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (1.txt) do (
- set "str1=%%i.........."
- set "str1=!str1:,..........=.!"
- for %%j in ("!str1!") do echo,%%~nj
- ))>2.txt
复制代码
注意:文本中不能存在“/\*?”之类的干扰符号。
作者: ShowCode 时间: 2023-11-28 11:38
回复 7# qixiaobin0715
误删 setlocal enabledelayedexpansion
作者: 77七 时间: 2023-11-28 13:09
- @echo off
- cd /d "%~dp0"
- set _"."=1
- set _","=1
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
- set str=%%b
- setlocal enabledelayedexpansion
- if "!str!" equ "" (
- echo=
- ) else (
- set _str=!str:~-1!
- if defined _"!_str!" (
- echo=!str:~0,-1!
- ) else (
- echo !str!
- )
- )
- endlocal
- ))>"%%~ni_2.txt"
- )
- pause
复制代码
作者: skpkmon 时间: 2023-11-28 14:22
回复 6# ShowCode
成功了,谢谢你帮忙,这里是好地方,高手如云,再次多谢申出援手的师兄!
作者: qixiaobin0715 时间: 2023-11-28 14:45
回复 8# ShowCode
谢谢提醒,已修改。
作者: qixiaobin0715 时间: 2023-11-28 16:45
这样可能更通用一些:- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (1.txt) do (
- set "str=%%i.........."
- set "str=!str:,..........=!"
- set "str=!str:...........=!"
- set "str=!str:..........=!"
- echo,!str!
- ))>2.txt
- pause
复制代码
存在“/\*?”也没问题。
作者: ShowCode 时间: 2023-11-28 16:54
回复 12# qixiaobin0715
原始文件里的空行被误删了
作者: aloha20200628 时间: 2023-11-28 19:56
本帖最后由 aloha20200628 于 2023-11-28 20:00 编辑
先给一段纯P代码对应一楼示例的解法》- @echo off
- ::定义中英文标点符号链表
- set "ps=,.;,。;"
- (for /f "tokens=1* delims=:" %%1 in ('findstr /n ".*" 原始有符号.txt') do (
- set "_s=%%2"
- if not defined _s (echo,) else (
- setlocal enabledelayedexpansion &set "endC=!_s:~-1!"
- for %%c in ("!endC!") do if "!ps!" neq "!ps:%%~c=!" (set "_s=!_s:~,-1!")
- echo,!_s!&endlocal
- )
- ))>"处理结果.txt"
- endlocal&exit/b
复制代码
借以上代码复习一遍多年老帖流传下来的三个纯P造码要点》
一。在 for 循环语句块内保全读入文本行中 ^&!%<\|/> 等特殊字符的关键,是安排变量延迟的开关位置,参考句式如下》
for /f "delims=" %%a in (test.txt) do (
set "s=%%a"
setlocal enabledelayedexpansion
... 处理文本行变量 !s! ...
endlocal
)
也许还有其他技法,请知者分享。
二。在 for 循环语句块内保留读入文件中的空行,其捷径是利用 findstr /n 功能,参考句式如下》
for /f "tokens=1* delims=:" %%1 in (test.txt) do (
set "s=%%2"
if not defined s ( ...空行处理... ) else (
...非空行处理...
)
)
也许还有其他技法,请知者分享。
三。调用字符串截取和替换函数时,若内外层参数均为变量时须讲究变量类型,形象而言就是内层变量须为百分号变量(普通全局变量/循环变量/命令行变量),外层变量须是感叹号变量,例如》!lv:%gv%=!, !v:%%a=!, !v:%1=! 都是有效的。反之 %gv:!lv!=% 是无效的。
若上述有缺,请知者补全。
作者: qixiaobin0715 时间: 2023-11-29 11:16
本帖最后由 qixiaobin0715 于 2023-11-29 11:18 编辑
回复 14# aloha20200628
读入文本空行也可采取 “(for循环 + set /p)<被读入的文件” 的方式,稍复杂些,也算是回答了13楼ShowCode的提醒。以本帖为例:- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in ('find /c /v "" 1.txt') do set /a n=%%j
- (for /l %%i in (1,1,!n!) do (
- set /p str=
- if not defined str (
- echo,
- ) else (
- set "str=!str!..........
- set "str=!str:,..........=!"
- set "str=!str:...........=!"
- set "str=!str:..........=!"
- echo,!str!
- set str=
- )
- ))<1.txt>2.txt
- pause
复制代码
作者: aloha20200628 时间: 2023-11-29 12:51
本帖最后由 aloha20200628 于 2023-11-29 13:00 编辑
回复 15# qixiaobin0715
采用 set/p 读入文件可将空行读为空串,但其有内生限制,每行读入量<1k。
set/p 写出文件的每行字节长度仍是<8k,但会拦截行首空格。
作者: buyiyang 时间: 2023-11-29 14:14
本帖最后由 buyiyang 于 2023-11-29 14:23 编辑
回复 14# aloha20200628
在 for 循环语句块内保全读入文本行中 ^&!%<\|/> 等特殊字符的关键,是安排变量延迟的开关位置
准确地说,保全"!"这一个特殊字符的关键是安排变量延迟的开关位置,其他特殊字符的处理是在for的索引变量扩展之前的,索引变量扩展之后不会再处理,
如果文本行没有"!",变量延迟的开关位置放在前面也可以。
for无法读取空行我的理解是,for语句执行do语句的索引就是索引变量%%i,当索引变量为空时就不会执行do语句,
比如 for %%i in () do echo,exist 就不会执行,这个特性有时候也可以利用,http://www.bathome.net/thread-66195-1-1.html- for /f "tokens=2" %%i in ('wmic process where "Name='WMIC.exe'" get Caption^,ExecutablePath') do set path=%%i
- echo %path%
复制代码
某些行只有一个多余的回车字符,当行只有一个字段时,而%%i被赋的值是第二个字段,为空,所以该轮循环的do不会执行,这样回车字符所在行就被过滤了。
关于延迟变量,我觉得有一个需要注意的点,由于变量延迟扩展,对特殊字符的处理在前,- setlocal enabledelayedexpansion
- set /a n=100
- if !n:~0,1! equ 1 echo,equal
复制代码
这里逗号,作为分隔符先被解析,导致扩展出错,需要加双引号,双引号内的特殊字符不会被处理。
作者: qixiaobin0715 时间: 2023-11-29 15:31
本帖最后由 qixiaobin0715 于 2023-11-29 15:32 编辑
回复 16# aloha20200628
有限制很正常啊,应当能够应付通常情况;
在for循环中应用set /p 逐行读取文本,正常情况下行首有空格也不会出现什么问题吧。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |