[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]文字txt内文字,批处理如何删除最尾的符号?

如何bat批量删除最尾的符号?请帮忙,谢谢
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 1# skpkmon


    请选2个txt文件作为例子打包上传到网盘
测试代码之前请做好备份

TOP

本帖最后由 skpkmon 于 2023-11-27 18:46 编辑

回复 2# ShowCode

https://vip.123pan.cn/1714872/%E5%88%86%E4%BA%AB/Desktop.rar

TOP

powershell -noprofile executionpolicy bypass "(gc 'a.txt') -replace '(.+).$','$1'">b.txt

TOP

回复 3# skpkmon

用第3方工具sed( http://bcn.bathome.net/tool/4.9/sed.exe )实现方法如下:
[code]
sed -r "/[ ,.;\t]+$/s///" 原始有符号.txt>删除符号.txt
[code]

TOP

回复 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%"
复制代码
1

评分人数

测试代码之前请做好备份

TOP

本帖最后由 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
复制代码
注意:文本中不能存在“/\*?”之类的干扰符号。

TOP

回复 7# qixiaobin0715


    误删 setlocal enabledelayedexpansion
测试代码之前请做好备份

TOP

  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
复制代码
bat小白,请多指教!谢谢!

TOP

回复 6# ShowCode


成功了,谢谢你帮忙,这里是好地方,高手如云,再次多谢申出援手的师兄!

TOP

回复 8# ShowCode
谢谢提醒,已修改。

TOP

这样可能更通用一些:
  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
复制代码
存在“/\*?”也没问题。

TOP

回复 12# qixiaobin0715


    原始文件里的空行被误删了
测试代码之前请做好备份

TOP

本帖最后由 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!=% 是无效的。
        若上述有缺,请知者补全。

TOP

本帖最后由 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
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

返回列表