找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 57800|回复: 20

[文本处理] 【已解决】求精简带有BOM的UFT-8文本的批处理

[复制链接]
发表于 2023-9-12 08:54:01 | 显示全部楼层 |阅读模式
要求:保留 {$CP936=    {$CP936=                    {$CP0=
                   ............       .................                   ...............        
                              $}                       $}                               $}
  各位大佬,请帮忙看看能不能实现
  因无法上传附件,只能使用123网盘上传修改内容,请见谅!
   https://www.123pan.com/s/UQLA-Tp0eh.html

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-9-12 10:32:46 | 显示全部楼层
回复 1# hfstar


http://bcn.bathome.net/s/tool/index.html?key=sed
生成结果无BOM:
  1. sed -n "/{\$CP936=/,/\$}/p; /{\$CP950=/,/\$}/p; /{\$CP0=/,/\$}/p; " License.txt > License-1.txt
复制代码
生成结果有BOM:
  1. sed -n "/{\$CP936=/,/\$}/p; /{\$CP950=/,/\$}/p; /{\$CP0=/,/\$}/p; " License.txt > License-1.txt
  2. sed -i "1s/^/\xEF\xBB\xBF/" License-1.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
hfstar + 1 多谢多谢

查看全部评分

发表于 2023-9-12 10:40:10 | 显示全部楼层
将批处理文件保存为UTF-8编码:
  1. @echo off
  2. chcp 65001
  3. (for /f "tokens=1* delims=]" %%i in ('find /v /n "" License.txt') do (
  4.     if "%%j"=="{$CP936=" (
  5.         set n=0
  6.     ) else if "%%j"=="{$CP950=" (
  7.         set n=0
  8.     ) else if "%%j"=="{$CP0=" (
  9.         set n=0
  10.     )
  11.     if defined n (
  12.         echo,%%j
  13.         if "%%j"=="$}" set n=
  14.     )
  15. ))>"License_精简.txt"
  16. pause
复制代码

评分

参与人数 2技术 +2 收起 理由
hfstar + 1 谢谢
77七 + 1 find也能打印行号,学习了!

查看全部评分

发表于 2023-9-12 10:46:19 | 显示全部楼层
  1. {$CP949=

  2. 이 프로그램은 개인/기업/학교/관공서등 어디서나 자유롭게 설치하여 사용이 가능합니다.

  3. * 주의사항
  4. - 이 프로그램의 저작권은 (주)카카오(http://www.kakao.com)에 있습니다.
  5. $}
  6. {$CP936=

  7. 本程序可供个人/企业/学校/**机关等自由场合任意安装和使用。

  8. - 本程序著作权归 Kakao 公司 (http://www.kakao.com) 所有。
  9. $}
  10. {$CP950=

  11. 本程式可供個人/企業/學校/**機關(機構)等自由場合任意安裝和使用。

  12. * 注意事項
  13. - 本程式著作權屬於 Kakao 公司 (http://www.kakao.com) 所有。
  14. $}
  15. {$JAPANESE=

  16. 本ソフトウェアはフリーウェア製品であり、非営利目的の範囲内に限り、個人、企業、教育機関、官公庁などで自由に使用できます。
  17. - 本ソフトウェアの著作権はKakao (http://www.kakao.com) が保有しています。
  18. $}
  19. {$CP0=

  20. This software is a freeware product, which can be used freely by individual/company/school/government office/etc. users to play media files as long as it's for non-commercial purposes.
  21. - This software copyrights (C) are owned by Kakao Corp.(https://www.kakaocorp.com/?lang=en)
  22. $}
复制代码

文本1.txt大概这样子

  1. @echo off
  2. chcp 65001 >nul

  3. set "file=1.txt"

  4. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
  5.         if "%%b" equ "{$CP936=" (
  6.                 set m=1
  7.         ) else if "%%b" equ "{$CP950=" (
  8.                 set m=1
  9.         ) else if "%%b" equ "{$CP0=" (
  10.                 set m=1
  11.         ) else if "%%b" equ "$}" (
  12.                 if defined m (
  13.                         echo %%b
  14.                 )
  15.                 set m=
  16.         )
  17.         if defined m (
  18.                 echo=%%b
  19.         )
  20. ))>2.txt
  21. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
hfstar + 1 多谢

查看全部评分

 楼主| 发表于 2023-9-12 10:54:41 | 显示全部楼层
回复 2# Batcher


    好用,非常感谢,有一个地方,原文件的编码是 UTF-8(rom) ,而处理出来的没有带(rom),能不能处理出来的文件编码和原文件编码一致呢
发表于 2023-9-12 10:57:36 | 显示全部楼层
回复 4# 77七
好像有大佬说过,find与其它编码的文本更适合。
发表于 2023-9-12 11:04:30 | 显示全部楼层
回复 5# hfstar


    试试2楼第二个代码
发表于 2023-9-12 11:04:45 | 显示全部楼层
回复 6# qixiaobin0715


   谢谢大佬指点!我一直以为只有findstr可以打印行号,以后就首选find了。
 楼主| 发表于 2023-9-12 11:07:55 | 显示全部楼层
回复 7# Batcher


    这个可以了,
 楼主| 发表于 2023-9-12 11:09:33 | 显示全部楼层
刚刚测试了一下,各位大佬的脚本都能完美实现,多谢你们的帮忙
发表于 2023-9-12 11:59:04 | 显示全部楼层
找了个创建utf-8 带bom文件的ps代码,模仿大佬用混编写到一起
  1. <# :
  2. cls&echo off&cd /d "%~dp0"&chcp 65001 >nul&set "current=%cd%"
  3. path %SYSTEMROOT%\System32\WindowsPowerShell\v1.0;%path%
  4. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal "%~f0"|Out-String|Invoke-Expression"
  5. set "file=1.txt"
  6. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
  7.         if "%%b" equ "{$CP936=" (
  8.                 set m=1
  9.         ) else if "%%b" equ "{$CP950=" (
  10.                 set m=1
  11.         ) else if "%%b" equ "{$CP0=" (
  12.                 set m=1
  13.         ) else if "%%b" equ "$}" (
  14.                 if defined m (
  15.                         echo %%b
  16.                 )
  17.                 set m=
  18.         )
  19.         if defined m (
  20.                 echo=%%b
  21.         )
  22. ))>>2.txt
  23. echo;done
  24. pause
  25. exit
  26. #>
  27. $filePath = "2.txt"

  28. # 创建文件并写入BOM
  29. $fileStream = [System.IO.File]::Create($filePath)
  30. $bom = New-Object byte[] 3
  31. $bom[0] = 0xEF
  32. $bom[1] = 0xBB
  33. $bom[2] = 0xBF
  34. $fileStream.Write($bom, 0, 3)
  35. $fileStream.Close()
复制代码
 楼主| 发表于 2023-9-12 12:45:56 | 显示全部楼层
回复 11# 77七


    学习了,
假如,我要用批处理调用 powershell 把 xml 文件中的 {$CP949=&#44036;&#45800; &#54045;&#50629; &#47700;&#45684;$} 替换为 {$CP936=简易弹出菜单$}{$CP950=簡易彈出選單$} ,那该怎么做呢?
发表于 2023-9-12 12:50:24 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2023-9-12 16:09 编辑

如果需要保留的不同字段类型较多,这样要简洁些:
  1. @echo off
  2. chcp 65001
  3. set var="&#65279;{$CP936=" "&#65279;{$CP950=" "&#65279;{$CP0="
  4. (for /f "tokens=1* delims=]" %%i in ('find /v /n "" License.txt') do (
  5.     if defined n (
  6.         echo,%%j
  7.         if "%%j"=="$}" set n=
  8.     ) else (
  9.         for %%k in (%var%) do (
  10.             if "%%j"==%%k (
  11.                 set n=0
  12.                 echo,%%j
  13.             )
  14.         )
  15.     )
  16. ))>"License_精简.txt"
  17. pause
复制代码
又修改了下,这样总的判断频次要少一些。
 楼主| 发表于 2023-9-12 12:52:38 | 显示全部楼层
回复 13# qixiaobin0715


    好的
发表于 2023-9-12 13:31:39 | 显示全部楼层
回复 12# hfstar


   
ps我不懂,bat也不太好替换等号。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 14:12 , Processed in 0.019925 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表