![Board logo](images/default/logo.gif)
标题: [文本处理] 【已解决】求精简带有BOM的UFT-8文本的批处理 [打印本页]
作者: hfstar 时间: 2023-9-12 08:54 标题: 【已解决】求精简带有BOM的UFT-8文本的批处理
要求:保留 {$CP936= {$CP936= {$CP0=
............ ................. ...............
$} $} $}
各位大佬,请帮忙看看能不能实现
因无法上传附件,只能使用123网盘上传修改内容,请见谅!
https://www.123pan.com/s/UQLA-Tp0eh.html
作者: Batcher 时间: 2023-9-12 10:32
回复 1# hfstar
http://bcn.bathome.net/s/tool/index.html?key=sed
生成结果无BOM:- sed -n "/{\$CP936=/,/\$}/p; /{\$CP950=/,/\$}/p; /{\$CP0=/,/\$}/p; " License.txt > License-1.txt
复制代码
生成结果有BOM:- sed -n "/{\$CP936=/,/\$}/p; /{\$CP950=/,/\$}/p; /{\$CP0=/,/\$}/p; " License.txt > License-1.txt
- sed -i "1s/^/\xEF\xBB\xBF/" License-1.txt
复制代码
作者: qixiaobin0715 时间: 2023-9-12 10:40
将批处理文件保存为UTF-8编码:- @echo off
- chcp 65001
- (for /f "tokens=1* delims=]" %%i in ('find /v /n "" License.txt') do (
- if "%%j"=="{$CP936=" (
- set n=0
- ) else if "%%j"=="{$CP950=" (
- set n=0
- ) else if "%%j"=="{$CP0=" (
- set n=0
- )
- if defined n (
- echo,%%j
- if "%%j"=="$}" set n=
- )
- ))>"License_精简.txt"
- pause
复制代码
作者: 77七 时间: 2023-9-12 10:46
- {$CP949=
-
- 이 프로그램은 개인/기업/학교/관공서등 어디서나 자유롭게 설치하여 사용이 가능합니다.
-
- * 주의사항
- - 이 프로그램의 저작권은 (주)카카오(http://www.kakao.com)에 있습니다.
- $}
- {$CP936=
-
- 本程序可供个人/企业/学校/**机关等自由场合任意安装和使用。
-
- - 本程序著作权归 Kakao 公司 (http://www.kakao.com) 所有。
- $}
- {$CP950=
-
- 本程式可供個人/企業/學校/**機關(機構)等自由場合任意安裝和使用。
-
- * 注意事項
- - 本程式著作權屬於 Kakao 公司 (http://www.kakao.com) 所有。
- $}
- {$JAPANESE=
-
- 本ソフトウェアはフリーウェア製品であり、非営利目的の範囲内に限り、個人、企業、教育機関、官公庁などで自由に使用できます。
- - 本ソフトウェアの著作権はKakao (http://www.kakao.com) が保有しています。
- $}
- {$CP0=
-
- 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.
- - This software copyrights (C) are owned by Kakao Corp.(https://www.kakaocorp.com/?lang=en)
- $}
复制代码
文本1.txt大概这样子
- @echo off
- chcp 65001 >nul
-
- set "file=1.txt"
-
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
- if "%%b" equ "{$CP936=" (
- set m=1
- ) else if "%%b" equ "{$CP950=" (
- set m=1
- ) else if "%%b" equ "{$CP0=" (
- set m=1
- ) else if "%%b" equ "$}" (
- if defined m (
- echo %%b
- )
- set m=
- )
- if defined m (
- echo=%%b
- )
- ))>2.txt
- pause
复制代码
作者: hfstar 时间: 2023-9-12 10:54
回复 2# Batcher
好用,非常感谢,有一个地方,原文件的编码是 UTF-8(rom) ,而处理出来的没有带(rom),能不能处理出来的文件编码和原文件编码一致呢
作者: qixiaobin0715 时间: 2023-9-12 10:57
回复 4# 77七
好像有大佬说过,find与其它编码的文本更适合。
作者: Batcher 时间: 2023-9-12 11:04
回复 5# hfstar
试试2楼第二个代码
作者: 77七 时间: 2023-9-12 11:04
回复 6# qixiaobin0715
谢谢大佬指点!我一直以为只有findstr可以打印行号,以后就首选find了。
作者: hfstar 时间: 2023-9-12 11:07
回复 7# Batcher
这个可以了,![](images/smilies/default/loveliness.gif)
作者: hfstar 时间: 2023-9-12 11:09
刚刚测试了一下,各位大佬的脚本都能完美实现,多谢你们的帮忙![](images/smilies/default/handshake.gif)
作者: 77七 时间: 2023-9-12 11:59
找了个创建utf-8 带bom文件的ps代码,模仿大佬用混编写到一起- <# :
- cls&echo off&cd /d "%~dp0"&chcp 65001 >nul&set "current=%cd%"
- path %SYSTEMROOT%\System32\WindowsPowerShell\v1.0;%path%
- powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal \"%~f0\"|Out-String|Invoke-Expression"
- set "file=1.txt"
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
- if "%%b" equ "{$CP936=" (
- set m=1
- ) else if "%%b" equ "{$CP950=" (
- set m=1
- ) else if "%%b" equ "{$CP0=" (
- set m=1
- ) else if "%%b" equ "$}" (
- if defined m (
- echo %%b
- )
- set m=
- )
- if defined m (
- echo=%%b
- )
- ))>>2.txt
- echo;done
- pause
- exit
- #>
- $filePath = "2.txt"
-
- # 创建文件并写入BOM
- $fileStream = [System.IO.File]::Create($filePath)
- $bom = New-Object byte[] 3
- $bom[0] = 0xEF
- $bom[1] = 0xBB
- $bom[2] = 0xBF
- $fileStream.Write($bom, 0, 3)
- $fileStream.Close()
复制代码
作者: hfstar 时间: 2023-9-12 12:45
回复 11# 77七
学习了,
假如,我要用批处理调用 powershell 把 xml 文件中的 {$CP949=간단 팝업 메뉴$} 替换为 {$CP936=简易弹出菜单$}{$CP950=簡易彈出選單$} ,那该怎么做呢?
作者: qixiaobin0715 时间: 2023-9-12 12:50
本帖最后由 qixiaobin0715 于 2023-9-12 16:09 编辑
如果需要保留的不同字段类型较多,这样要简洁些:- @echo off
- chcp 65001
- set var="{$CP936=" "{$CP950=" "{$CP0="
- (for /f "tokens=1* delims=]" %%i in ('find /v /n "" License.txt') do (
- if defined n (
- echo,%%j
- if "%%j"=="$}" set n=
- ) else (
- for %%k in (%var%) do (
- if "%%j"==%%k (
- set n=0
- echo,%%j
- )
- )
- )
- ))>"License_精简.txt"
- pause
复制代码
又修改了下,这样总的判断频次要少一些。
作者: hfstar 时间: 2023-9-12 12:52
回复 13# qixiaobin0715
好的![](images/smilies/default/handshake.gif)
作者: 77七 时间: 2023-9-12 13:31
回复 12# hfstar
ps我不懂,bat也不太好替换等号。
作者: hfstar 时间: 2023-9-12 13:52
回复 15# 77七
没事没事
作者: buyiyang 时间: 2023-9-12 14:22
回复 11# 77七
批处理可以这样产生bom头- >bom echo(77u/
- certutil -decode -f bom 2.txt
复制代码
还可以这样,参考:http://www.bathome.net/viewthread.php?tid=12347&rpid=79254&ordertype=0&page=1#pid79254- @ECHO off&setlocal EnableDelayedExpansion
- Set gbk=可去便
- chcp 437>nul
- for /f %%a in ('cmd/u/cecho !gbk!')do set utf=%%a
- Set head=!utf:~0,1!!utf:~2,1!!utf:~4,1!
- set/p=!head!<nul>2.txt
复制代码
作者: hfstar 时间: 2023-9-12 15:05
回复 17# buyiyang
刚刚写的,替换不成功,能否指点一下问题出在哪?
@echo off & cd/d "%~dp0"
chcp 65001
set YB='{$CP949^=간단 팝업 메뉴$}'
set TH='{$CP936^=简易弹出菜单$}{$CP950^=簡易彈出選單$}'
powershell -c "(Get-Content SimpleMenu.xml -encoding utf8 ) -Replace %YB%,%TH%" > SimpleMenu测试.xml
pause>nul & exit
作者: 77七 时间: 2023-9-12 15:11
回复 17# buyiyang
谢谢大佬指点!这样用bat生成 utf-8 带bom方便多了。
作者: buyiyang 时间: 2023-9-12 15:34
回复 18# hfstar
你的%YB%和%TH%中的^$符号需要\转义
作者: hfstar 时间: 2023-9-12 15:54
回复 20# buyiyang
搞定了,多谢大佬的指点。![](images/smilies/default/handshake.gif)
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |