Board logo

标题: [文本处理] [已解决]文字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
  1. @echo off
  2. set "OldFile=1.txt"
  3. set "NewFile=2.txt"
  4. cd /d "%~dp0"
  5. powershell "(Get-Content '%OldFile%') -replace '[,.;!]+$'" >"%NewFile%"
复制代码

作者: qixiaobin0715    时间: 2023-11-28 11:21

本帖最后由 qixiaobin0715 于 2023-11-28 14:44 编辑

如果还有别的符号可在第4行后面按照第4行的方式添加即可:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in (1.txt) do (
  4.     set "str1=%%i.........."
  5.     set "str1=!str1:,..........=.!"
  6.     for %%j in ("!str1!") do echo,%%~nj
  7. ))>2.txt
复制代码
注意:文本中不能存在“/\*?”之类的干扰符号。
作者: ShowCode    时间: 2023-11-28 11:38

回复 7# qixiaobin0715


    误删 setlocal enabledelayedexpansion
作者: 77七    时间: 2023-11-28 13:09

  1. @echo off
  2. cd /d "%~dp0"
  3. set _"."=1
  4. set _","=1
  5. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  6. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
  7. set str=%%b
  8. setlocal enabledelayedexpansion
  9. if "!str!" equ "" (
  10. echo=
  11. ) else (
  12. set _str=!str:~-1!
  13. if defined _"!_str!" (
  14. echo=!str:~0,-1!
  15. ) else (
  16. echo !str!
  17. )
  18. )
  19. endlocal
  20. ))>"%%~ni_2.txt"
  21. )
  22. pause
复制代码

作者: skpkmon    时间: 2023-11-28 14:22

回复 6# ShowCode


成功了,谢谢你帮忙,这里是好地方,高手如云,再次多谢申出援手的师兄!
作者: qixiaobin0715    时间: 2023-11-28 14:45

回复 8# ShowCode
谢谢提醒,已修改。
作者: qixiaobin0715    时间: 2023-11-28 16:45

这样可能更通用一些:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in (1.txt) do (
  4.     set "str=%%i.........."
  5.     set "str=!str:,..........=!"
  6.     set "str=!str:...........=!"
  7.     set "str=!str:..........=!"
  8.     echo,!str!
  9. ))>2.txt
  10. pause
复制代码
存在“/\*?”也没问题。
作者: ShowCode    时间: 2023-11-28 16:54

回复 12# qixiaobin0715


    原始文件里的空行被误删了
作者: aloha20200628    时间: 2023-11-28 19:56

本帖最后由 aloha20200628 于 2023-11-28 20:00 编辑


先给一段纯P代码对应一楼示例的解法》
  1. @echo off
  2. ::定义中英文标点符号链表
  3. set "ps=,.;,。;"
  4. (for /f "tokens=1* delims=:" %%1 in ('findstr /n ".*" 原始有符号.txt') do (
  5. set "_s=%%2"
  6. if not defined _s (echo,) else (
  7. setlocal enabledelayedexpansion &set "endC=!_s:~-1!"
  8. for %%c in ("!endC!") do if "!ps!" neq "!ps:%%~c=!" (set "_s=!_s:~,-1!")
  9. echo,!_s!&endlocal
  10. )
  11. ))>"处理结果.txt"
  12. 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的提醒。以本帖为例:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims=:" %%i in ('find /c /v "" 1.txt') do set /a n=%%j
  4. (for /l %%i in (1,1,!n!) do (
  5.     set /p str=
  6.     if not defined str (
  7.         echo,
  8.     ) else (
  9.         set "str=!str!..........
  10.         set "str=!str:,..........=!"
  11.         set "str=!str:...........=!"
  12.         set "str=!str:..........=!"
  13.         echo,!str!
  14.         set str=
  15.     )
  16. ))<1.txt>2.txt
  17. 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
  1. for /f "tokens=2" %%i in ('wmic process where "Name='WMIC.exe'" get Caption^,ExecutablePath') do set path=%%i
  2. echo %path%
复制代码
某些行只有一个多余的回车字符,当行只有一个字段时,而%%i被赋的值是第二个字段,为空,所以该轮循环的do不会执行,这样回车字符所在行就被过滤了。

关于延迟变量,我觉得有一个需要注意的点,由于变量延迟扩展,对特殊字符的处理在前,
  1. setlocal enabledelayedexpansion
  2. set /a n=100
  3. 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://www.bathome.net/) Powered by Discuz! 7.2