返回列表 发帖

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

要求:保留 {$CP936=    {$CP936=                    {$CP0=
                   ............       .................                   ...............        
                              $}                       $}                               $}
  各位大佬,请帮忙看看能不能实现
  因无法上传附件,只能使用123网盘上传修改内容,请见谅!
   https://www.123pan.com/s/UQLA-Tp0eh.html
1

评分人数

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

回复 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.txtCOPY
生成结果有BOM:
sed -n "/{\$CP936=/,/\$}/p; /{\$CP950=/,/\$}/p; /{\$CP0=/,/\$}/p; " License.txt > License-1.txt
sed -i "1s/^/\xEF\xBB\xBF/" License-1.txtCOPY
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

将批处理文件保存为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"
pauseCOPY
2

评分人数

    • hfstar: 谢谢技术 + 1
    • 77七: find也能打印行号,学习了!技术 + 1

TOP

{$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)
$}COPY

文本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
pauseCOPY
1

评分人数

bat小白,请多指教!谢谢!

TOP

回复 2# Batcher


    好用,非常感谢,有一个地方,原文件的编码是 UTF-8(rom) ,而处理出来的没有带(rom),能不能处理出来的文件编码和原文件编码一致呢

TOP

回复 4# 77七
好像有大佬说过,find与其它编码的文本更适合。

TOP

回复 5# hfstar


    试试2楼第二个代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# qixiaobin0715


   谢谢大佬指点!我一直以为只有findstr可以打印行号,以后就首选find了。
bat小白,请多指教!谢谢!

TOP

回复 7# Batcher


    这个可以了,

TOP

刚刚测试了一下,各位大佬的脚本都能完美实现,多谢你们的帮忙

TOP

找了个创建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()COPY
bat小白,请多指教!谢谢!

TOP

回复 11# 77七


    学习了,
假如,我要用批处理调用 powershell 把 xml 文件中的 {$CP949=간단 팝업 메뉴$} 替换为 {$CP936=简易弹出菜单$}{$CP950=簡易彈出選單$} ,那该怎么做呢?

TOP

本帖最后由 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"
pauseCOPY
又修改了下,这样总的判断频次要少一些。

TOP

回复 13# qixiaobin0715


    好的

TOP

回复 12# hfstar


   
ps我不懂,bat也不太好替换等号。
bat小白,请多指教!谢谢!

TOP

返回列表