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

[文本处理] [已解决]如何给文本添加行及删除位置不确定的字符串所在的行?

[复制链接]
发表于 2011-1-10 00:07:49 | 显示全部楼层 |阅读模式
要处理INTL.INF文件中的若干个行:

1、将E00E0804改为E0860804
2、将pintlgnt.ime改为sun86.ime
3、删除simsun.ttc,,,65536一行
4、在[SourceDisksFiles]段的末尾追加3行内容:
Sun86.IME    = 107,,,,,,,0,0
Sun86.mb     = 107,,,,,,,0,0
Sun86.chm    = 107,,,,,,,0,0

5、删除其它所有的含有pintlgnt字符串的行(但不能把含有pintlgnt.ime字符串的行删掉,因为它要改成sun86.ime),pintlgnt字符串在各行中的位置不确定。

目前,已经实现1、2、3项,但无法实现4、5两项需求。当前代码如下:
  1. type INTL.INF>INTL.TMP@echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "INTL.TMP"') do if "%%b"=="" (echo/) else (
  3.     set "hy=%%b"
  4.     set hy=!hy:E00E0804=E0860804!
  5.     set hy=!hy:pintlgnt.ime=sun86.ime!
  6.     if /i not "!hy:~0,18!"=="simsun.ttc,,,65536" echo !hy!
  7. ))>"INTL.INF"
复制代码
这里对添加行还有一个要求,即首先要找到[SourceDisksFiles]段,然后在它的下一个段开始前添加行,因此不能用人工定位该段最后一行字符串的办法添加。

实际上还需要修改txtsetup.sif和 DOSNET.INF两个文件,情况类似。只是想通过修改这个文件,自己学会利用段名来确定位置,在指定位置添加含有特殊字符的行,以及删改含有某个位置不确定的字符串所在的行。

在论坛搜索到了一些添加行的方法,一时无从下手,又急着用,就直接问了。

附:INTL.INF文件压缩件(UNCODE编码)

[ 本帖最后由 stance 于 2011-1-10 16:27 编辑 ]

评分

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

查看全部评分

 楼主| 发表于 2011-1-10 00:14:58 | 显示全部楼层
奇怪!一加CODE代码就乱,只好这么发了。批处理的格式也改不过来,麻烦版主帮助弄一下吧。

[ 本帖最后由 stance 于 2011-1-10 00:19 编辑 ]
发表于 2011-1-10 01:43:30 | 显示全部楼层
以下代码会修改INTL.INF,先备份INTL.INF文件。。。
  1. @echo off
  2. (for /f "delims=" %%i in ('findstr /iv "simsun.ttc,,,65536" INTL.INF') do (
  3.    set "str=%%i"
  4.    setlocal enabledelayedexpansion
  5.    set str=!str:e00e0804=e0860804!
  6.    set str=!str:pintlgnt.ime=sun86.ime!
  7.    set num=!str:pintlgnt=!
  8.    if "!num!"=="!str!" echo;!str!
  9.    if /i "!str!"=="[sourcedisksfiles]" (
  10.       echo Sun86.IME    = 107,,,,,,,0,0
  11.       echo Sun86.mb     = 107,,,,,,,0,0
  12.       echo Sun86.chm    = 107,,,,,,,0,0
  13.    )
  14.    endlocal
  15. ))>tem
  16. move tem INTL.INF
  17. start "" "INTL.INF"
复制代码

评分

参与人数 1技术 +1 收起 理由
stance + 1 实在是高!甚为体贴。

查看全部评分

发表于 2011-1-10 06:36:49 | 显示全部楼层
1,楼主提供的inf文件中,包含大量UNICODE编码字符,这些字符在输出为ANSI编码时会错误。
2,要把内容加到[SourceDisksFiles]节的最下面,但楼主提供的文件中包含2个[SourceDisksFiles]节,加在哪个最下面?

[ 本帖最后由 hanyeguxing 于 2011-1-10 14:22 编辑 ]

评分

参与人数 1技术 +1 收起 理由
stance + 1 认真负责,细致入微。

查看全部评分

 楼主| 发表于 2011-1-10 11:25:27 | 显示全部楼层

回复 3楼 的帖子

感谢随风老大给出的批处理,甚合我意。
代码实在高超,一个DO()>tem就把文本内容输出来了——还在琢磨是怎么回事,是不是隐含的ELSE语句起了作用?
括号内的语句平实易懂,移植性强,真是大道至简,叹为观止!
 楼主| 发表于 2011-1-10 11:37:57 | 显示全部楼层

回复 4楼 的帖子

回 寒夜版主:
1、UNICODE码的问题确实存在,文本中的所有韩文和部分日文字符被显示为??号。我用“另存为”测试,也是这样,因此认为这是UNCODE转码的问题。
我看到您的头像里有韩文字符,正想专门问这个问题。
表面上看,这个问题不影响安装和使用,所以没急着问,但不知是否存在隐蔽的系统缺陷。如果能解决,最好不过了。
2、[SourceDisksFiles]问题:应该加在第一个后面。我也是刚刚发现这个问题,琢磨该怎么处理。
发表于 2011-1-10 12:09:47 | 显示全部楼层
1,如果要保证编码不出问题,推荐使用第三方或 vbs
2:
  1. @echo off&setlocal enabledelayedexpansion
  2. type "INTL.INF">temp
  3. set c==
  4. (for /f "tokens=1* delims=:" %%a in ('findstr /nivx "simsun.ttc,,,65536" "temp"') do if "%%b"=="" (echo/) else (
  5.    set "b=%%b"
  6.    if "!c!!d!"=="==" if "!b:~0,1!!b:~-1!"=="[]" (
  7.       echo Sun86.IME    = 107,,,,,,,0,0
  8.       echo Sun86.mb     = 107,,,,,,,0,0
  9.       echo Sun86.chm    = 107,,,,,,,0,0
  10.       set c=&set d=
  11.    )
  12.    if /i "!b!"=="[sourcedisksfiles]" set d==
  13.    set b=!b:e00e0804=e0860804!
  14.    set b=!b:pintlgnt.ime=sun86.ime!
  15.    set a=!b:pintlgnt=!
  16.    if "!a!"=="!b!" echo/!b!
  17. ))>"INTL.INF"
  18. del temp
复制代码

[ 本帖最后由 hanyeguxing 于 2011-1-10 14:35 编辑 ]
 楼主| 发表于 2011-1-10 12:56:19 | 显示全部楼层

回复 7楼 的帖子

这个方案不错!谢谢寒夜版主。
不过,运行后输出一个空文本——您的代码中findb,应该是findstr吧,我是改后又测试过的。
发表于 2011-1-10 13:26:00 | 显示全部楼层

回复 8楼 的帖子

打字总马马虎虎的,不好意思,已经改正
 楼主| 发表于 2011-1-10 13:54:41 | 显示全部楼层
奇怪的现象,生成过一次新文本,以后再运行,又出空文本。以前也遇到过这类情况,找不到原因。

另外,在生成的那次查看,好像第二个[sourcedisksfiles]段中也被加入了新的字符串。
发表于 2011-1-10 13:59:41 | 显示全部楼层
把内容加到第一个[sourcedisksfiles]后面
:
  1. @echo off
  2. (for /f "delims=" %%i in ('findstr /iv "simsun.ttc,,,65536" INTL.INF') do (
  3.    set "str=%%i"
  4.    if /i "%%i"=="[sourcedisksfiles]" set /a flag+=1
  5.    setlocal enabledelayedexpansion
  6.    set str=!str:e00e0804=e0860804!
  7.    set str=!str:pintlgnt.ime=sun86.ime!
  8.    set num=!str:pintlgnt=!
  9.    if "!num!"=="!str!" echo;!str!
  10.    if !flag! equ 1 (
  11.       echo Sun86.IME    = 107,,,,,,,0,0
  12.       echo Sun86.mb     = 107,,,,,,,0,0
  13.       echo Sun86.chm    = 107,,,,,,,0,0
  14.    )
  15.    endlocal
  16. ))>tem
  17. move tem INTL.INF
  18. start "" "INTL.INF"
复制代码
发表于 2011-1-10 14:01:23 | 显示全部楼层

回复 10楼 的帖子

实际测试,使用 UltraCompare 二进制完全比较,未发现任何差异。
发表于 2011-1-10 14:04:08 | 显示全部楼层

回复 11楼 的帖子

楼主是要把内容加的此节的最下面,不是节名的下一行,呵呵,而且文件为源UNICODE编码

顺便再说7楼的代码要求先将源文件的只读属性去掉,否则:
  1. @echo off&setlocal enabledelayedexpansion
  2. type "INTL.INF">temp
  3. set c==
  4. (for /f "tokens=1* delims=:" %%a in ('findstr /nivx "simsun.ttc,,,65536" "temp"') do if "%%b"=="" (echo/) else (
  5.    set "b=%%b"
  6.    if "!c!!d!"=="==" if "!b:~0,1!!b:~-1!"=="[]" (
  7.       echo Sun86.IME    = 107,,,,,,,0,0
  8.       echo Sun86.mb     = 107,,,,,,,0,0
  9.       echo Sun86.chm    = 107,,,,,,,0,0
  10.       set c=&set d=
  11.    )
  12.    if /i "!b!"=="[sourcedisksfiles]" set d==
  13.    set b=!b:e00e0804=e0860804!
  14.    set b=!b:pintlgnt.ime=sun86.ime!
  15.    set a=!b:pintlgnt=!
  16.    if "!a!"=="!b!" echo/!b!
  17. ))>temp2
  18. move temp2 "INTL.INF"
  19. del /q temp
复制代码

[ 本帖最后由 hanyeguxing 于 2011-1-10 15:38 编辑 ]
 楼主| 发表于 2011-1-10 14:24:26 | 显示全部楼层

回复 11楼 的帖子

谢谢随风老大再出手!
这个代码的意思我大概读懂了,但我自己做不出来,也不会改。
测试结果有点问题:从第一个[sourcedisksfiles]段开始,每一行后面都被加入了三行这样的内容:
Sun86.IME    = 107,,,,,,,0,0
Sun86.mb     = 107,,,,,,,0,0
Sun86.chm    = 107,,,,,,,0,0
批处理在接到[sourcedisksfiles]指示后,就从这一行开始,给每行都加这三行内容。
似乎应该再加点条件限制,防止它给以后各行都加新三行。
 楼主| 发表于 2011-1-10 14:30:10 | 显示全部楼层

回复 12楼的帖子

回寒夜版主:
1、大概是我的系统环境有问题,以前你给我代码时也遇到过。
刚才换了台机器测试,还是空文本。如果你测试没问题,相信就能通过。我再换个办法试试。

2、如果代码太复杂,只加到节名下面也行。
3、不要求非得UNICODE编码。

另外,我用TOTAL COMMAND自带的”比较文件内容“功能,也很强大,而且非常方便、体贴。这个软件有很多强大的功能,支持正则表达式,尤其适合常玩DOS的人,建议试试。

[ 本帖最后由 stance 于 2011-1-10 15:07 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-16 22:42 , Processed in 0.026686 second(s), 10 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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