Board logo

标题: [文本处理] 【已解决】批处理如何将文本内容按指定字数分行(如15个字自动换行)? [打印本页]

作者: ruoru376    时间: 2015-1-22 16:30     标题: 【已解决】批处理如何将文本内容按指定字数分行(如15个字自动换行)?

本帖最后由 pcl_test 于 2016-8-15 13:36 编辑

例文:
的打斗场面令人震撼可谓招招见拳拳到肉记者倪自放囘力街区有望月上映保罗飙车神技将再现由基美影业与囯欧罗巴联合出品囯际著名导演吕克贝松身兼三职担纲监制制片编剧的动作电影囘力街区有望在今年月登陆囯内院线作为吕克贝松风靡全球的经典动作电影囘力区的升级版该片还是好莱坞巨星速度与激囘情系列主演保罗沃克最后一部完整遗囘作曰前该片 的打……
处理后效果:
的打斗场面令人震撼可谓招招见拳
拳到肉记者倪自放囘力街区有望月
上映保罗飙车神技将再现由基美影
业与囯欧罗巴联合出品囯际著名导
演吕克贝松身兼三职担纲监制制片
……
你哪位大神能够教教我,在此感激不尽了…

作者: CrLf    时间: 2015-1-22 16:48

  1. 1>1/* :Bat+JScript
  2. @echo off
  3. cscript -nologo -e:jscript "%~0" <a.txt >b.txt
  4. pause & exit /b
  5. */
  6. WSH.Echo(
  7. WSH.StdIn.ReadAll().replace(/.{15}/gm,"$&\r\n")
  8. )
复制代码

作者: ruoru376    时间: 2015-1-22 16:58

回复 2# CrLf
非常完美,非常感谢!!
作者: ruoru376    时间: 2015-1-27 20:38

回复 2# CrLf

    您好!您给我的这段代码很好!
但是为什么直接在其前面加其他功能代码  就出现错误呢? 我试了,让它建成单独bat,用call 调用可以。我希望所有批量处理都在一个bat里面,执行A代码之后 再执行上述代码 之后再执行C代码。这样如何做?希望能得到您的帮助!
比如:
sed -n  "s/[A-Za-z0-9]//g" BT.txt>BT.tx &rem 说明:去空格,所有行合并。
1>1/* :Bat+JScript
@echo off
cscript -nologo -e:jscript "%~0" <BT.tx >BT1.tx
  pause exit /b
*/

WSH.Echo(
        WSH.StdIn.ReadAll().replace(/.{250}/gm,"$&\r\n")
)
————————————————————————不能执行。
作者: dqcmjx    时间: 2015-1-28 10:53

  1. @echo off&setlocal enabledelayedexpansion&pushd %~dp0
  2. set var=&for /f "delims=" %%i in (a.txt) do set "var=!var!%%i"&set "var=!var: =!"
  3. :lp
  4. echo %var:~,15%&set "var=%var:~15%"
  5. if defined var goto lp
  6. pause
复制代码

作者: ruoru376    时间: 2015-1-28 11:28

回复 5# dqcmjx

是个死循环
作者: dqcmjx    时间: 2015-1-28 12:58

本帖最后由 dqcmjx 于 2015-1-28 13:06 编辑

回复 6# ruoru376

我测试正常,截图怎么传不上去
作者: ruoru376    时间: 2015-1-28 13:33

回复 6# ruoru376


真的不行的,一直在动。原文件,没有任何变动……对于Bat 我基本不懂。你说你测试能行?不敢相信
作者: amwfjhh    时间: 2015-1-28 13:51

批处理的特殊字符一直是个痛点,若讲兼容性好些的,还就用 CrLf 的BJ混排的方案比较好。楼上所出现的异常,多半跟其中的几个括号"()"有关。
作者: amwfjhh    时间: 2015-1-28 14:17

回复 4# ruoru376


    BJ混排技术可以参照以下链接:
http://bbs.bathome.net/viewthrea ... &from=favorites
是利用JScript的特殊多行注释或条件编译语句,将批处理脚本包含其中,这种特殊技术要同时满足批处理脚本不会异常退出,并且第一行是合法的JS条件语句或注释语法。在批处理脚本部分,在合适的地方利用 goto :eof或者exit /b等方法及时跳出脚本而避免接下来的JScript部分被错误解析。
所以就你的添加代码来讲,应该添至/**/之间的合适部分,则可作为批处理脚本被解析,否则在脚本被作为JScript文件载入时会因用法不符合JScript语法而报错。
作者: ruoru376    时间: 2015-1-28 14:30

回复 10# amwfjhh

不能解决问题,还是非常感谢你的回答!
我只要想用二楼的代码,因为发现效率比较高速度快。有没有什么方法在一个bat里面调用啊? 另建一个bat,再调用时可以的,但是很麻烦……
作者: amwfjhh    时间: 2015-1-28 14:45

本帖最后由 amwfjhh 于 2015-1-28 16:08 编辑

用这个试试
测试文本:1.txt
  1. 的打斗场面令人震!<>"~%&*()撼可谓招招见拳拳到肉记者倪自放囘力街区有望月上映保罗飙车神技将再现由基美影业与囯欧罗巴联合出品囯际著名导演吕克贝松身兼三职担纲监制制片编剧的动作电影囘力街区有望在今年月登陆囯内院线作为吕克贝松风靡全球的经典动作电影囘力区的升级版该片还是好莱坞巨星速度与激囘情系列主演保罗沃克最后一部完整遗囘作曰前该片 的打……
  2. 的打斗场面令人震撼可谓招招见拳拳到!<>"~%&*()肉记者倪自放囘力街区有望月上映保罗飙车神技将再现由基美影业与囯欧罗巴联合出品囯际著名导演吕克贝松身兼三职担纲监制制片编剧的动作电影囘力街区有望在今年月登陆囯内院线作为吕克贝松风靡全球的经典动作电影囘力区的升级版该片还是好莱坞巨星速度与激囘情系列主演保罗沃克最后一部完整遗囘作曰前该片 的打……
  3. 的打斗场面令人震撼可!<>"()~%&*谓招招见拳拳到肉记者倪自放囘力街区有望月上映保罗飙车神技将再现由基美影业与囯欧罗巴联合出品囯际著名导演吕克贝松身兼三职担纲监制制片编剧的动作电影囘力街区有望在今年月登陆囯内院线作为吕克贝松风靡全球的经典动作电影囘力区的升级版该片还是好莱坞巨星速度与激囘情系列主演保罗沃克最后一部完整遗囘作曰前该片 的打……
  4. 的打斗场面令人震撼可谓招招见拳拳到肉记者倪自放囘力街区有望月上!<>"~%()&*映保罗飙车神技将再现由基美影业与囯欧罗巴联合出品囯际著名导演吕克贝松身兼三职担纲监制制片编剧的动作电影囘力街区有望在今年月登陆囯内院线作为吕克贝松风靡全球的经典动作电影囘力区的升级版该片还是好莱坞巨星速度与激囘情系列主演保罗沃克最后一部完整遗囘作曰前该片 的打……
复制代码
处理脚本:
  1. @echo oFF
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('find /c /v ""^<"1.txt"') do set /a "nLines=%%i"
  4. (
  5.   for /l %%i in (1 1 %nLines%) do (
  6.     echo,第 %%i 行格式化显示...
  7.     set /p "strLine="
  8.     echo,原始内容 : "!strLine!"
  9.     call :_showFormat "strLine"
  10.     set "strLine="
  11.     echo,&echo,
  12.   )
  13. )<"1.txt"
  14. pause & goto :EOF
  15. :_showFormat
  16. (
  17. if defined %~1 (
  18.   set "strFormat=!%~1!"
  19.   set "strTmp=!strFormat:~0, 15!"
  20.   echo,!strTmp!
  21.   
  22.   set "strFormat=!strFormat:~15!"
  23.   if defined strFormat (
  24.     call :_showFormat "strFormat"
  25.   )
  26. )
  27.   goto :EOF
  28. )
复制代码

作者: tmplinshi    时间: 2015-1-28 15:08

本帖最后由 tmplinshi 于 2015-1-28 15:11 编辑

回复 4# ruoru376


要把 sed 命令或者其他的放在 /* 和 */ 之间。
因为 cscript -nologo -e:jscript "%~0" 这句是把这个批处理文件作为 js 脚本来调用的,所以整个文件的代码也要符合 js 的语法。
/* 和 */ 之间是作为 js 中的注释,所以你可以把批处理代码放在里面。
1>1/* :Bat+JScript
@echo off
代码放在这里
cscript -nologo -e:jscript "%~0" <a.txt >b.txt
pause & exit /b
*/

WSH.Echo(
        WSH.StdIn.ReadAll().replace(/.{15}/gm,"$&\r\n")
)

在这个例子中,你的 sed 命令也可以这样对接:
  1. sed "s/[A-Za-z0-9]//g" BT.txt | cscript -nologo -e:jscript "%~0" >b.txt
复制代码
或者直接用 js 代码取代这个 sed 命令:
  1. WSH.Echo(
  2.         WSH.StdIn.ReadAll()
  3.                 .replace(/.{15}/gm, "$&\r\n")
  4.                 .replace(/[A-Za-z0-9]/g, "")
  5. )
复制代码

作者: 慕夜蓝化    时间: 2015-1-28 15:55

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.     set "str=%%i"
  4.     call :splitString
  5. )
  6. pause&exit
  7. :splitString
  8. if not "!str!"=="" (
  9.     echo,!str:~,15!&set "str=!str:~15!"&goto :splitString
  10. ) else (
  11.     goto :eof
  12. )
复制代码
我原来以为回复过了。你试下。
作者: ruoru376    时间: 2015-1-28 16:23

回复 13# tmplinshi
学习了,谢谢。
如果是for 怎么对接呢?比如:for /f "tokens=*" %%i in (a.tx) do set /p "var=%%i;" <nul >>b.tx
作者: ruoru376    时间: 2015-1-28 16:28

本帖最后由 ruoru376 于 2015-1-28 16:36 编辑

回复 14# 慕夜蓝化
大师 看出效果,但是没有写出文件啊
自己改好了,效果很好。略比bat JScript (二楼)慢一点。但是比sed 快多了。谢谢!学习了……
作者: CrLf    时间: 2015-1-28 16:39

sed 和 js 都可以实现楼主的需求,从效率上考虑,建议只用二者之一来实现
作者: pcl_test    时间: 2016-8-15 13:42

第三方
  1. gawk "gsub(/.{15}/,\"^&\n\")" 1.txt|find /v ""
  2. pause
复制代码

作者: dj9999    时间: 2017-8-7 14:26

回复 2# CrLf
你好,使用你的代码第二次操作的时候出现内容错字。

“可能的没有受过任何挫
折和磨难这也养成了骄
纵暴戾稍不满意便�?
大发脾气的混蛋性格�
�为不愿意来燕子坞过�
�节但是的母亲却偏偏�
�迫来了不敢把这怒气”

不知道为什么会有问号出现,麻烦指教一下




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2