Board logo

标题: [文本处理] 批处理UTF8文本找到特定字符后删除上一行 [打印本页]

作者: leo198444    时间: 2011-6-5 21:49     标题: 批处理UTF8文本找到特定字符后删除上一行

我有一个UTF8文本,假设为A.TXT

希望处理它后不产生乱码,而且以下的文本格式都是纵列的

处理前:

  <MATab>  
<tabID>tbp0</tabID>
  <tabName>中文化</tabName>
<MAButton>
      <tabID>tbp0</tabID>     
<buttonID>btnMAQ</buttonID>

我希望找到文本里<tabID>tbp0</tabID>这个字符串,然后删除这个字符串的上一行

处理后:

    <tabID>tbp0</tabID>
  <tabName>中文化</tabName>
<MAButton>
      <tabID>tbp0</tabID>      
<buttonID>btnMAQ</buttonID>


但<tabID>tbp0</tabID>这个字符串不止一个,如果要单独删除<MATab>这个字符串,就不能以<tabID>tbp0</tabID>作为分隔符

还有一个小请求,希望文本处理以后,可以一样在A.TXT输出

请问该怎么处理

谢谢!

请下载范例脚本
作者: CrLf    时间: 2011-6-5 22:00

为什么删了<MATab>却不删<MAButton>
作者: leo198444    时间: 2011-6-5 22:05

为什么删了却不删
zm900612 发表于 2011-6-5 22:00

我知道这在FOR逻辑里不合理且不好处理

但因为这是特殊XML文本

如果不单独删除掉<MATab>,软件就无法运行
作者: Batcher    时间: 2011-6-5 22:05

能否在顶楼上传一个UTF-8格式的文件供大家测试?
作者: leo198444    时间: 2011-6-5 22:10

能否在顶楼上传一个UTF-8格式的文件供大家测试?
Batcher 发表于 2011-6-5 22:05


已上传了
作者: CrLf    时间: 2011-6-5 22:12

看不懂楼主所举例子中的内在逻辑
作者: Batcher    时间: 2011-6-5 22:14

3# leo198444


问题不是在for里面是否容易处理
关键在于:
<MATab>和<MAButton>同样都是在<tabID>tbp0</tabID>的上一行,为何区别对待?
作者: leo198444    时间: 2011-6-5 22:20

3# leo198444


问题不是在for里面是否容易处理
关键在于:
和同样都是在tbp0的上一行,为何区别对待?
Batcher 发表于 2011-6-5 22:14


这就讨论到软件运行的原理了
因为<MAButton>是包含子选单
<MATab>是包含主选单

如果更简单说
就是我要把<MATab>删除,让软体变子选单就对了@@

我用NSIS封装软件虽然不用烦恼编码问题,但找不到方法处理
作者: Batcher    时间: 2011-6-5 22:25

我希望找到文本里<tabID>tbp0</tabID>这个字符串,然后删除这个字符串的上一行

但<tabID>tbp0</tabID>这个字符串不止一个,如果要单独删除<MATab>这个字符串,就不能以<tabID>tbp0</tabID>作为分隔符
额滴个神啊,实在搞不懂你着两个要求是怎样和谐并存的。
猜一下吧:
如果发现<tabID>tbp0</tabID>的上一行是<MATab>,就把<MATab>删掉。
是这个意思不?
作者: leo198444    时间: 2011-6-5 22:28

额滴个神啊,实在搞不懂你着两个要求是怎样和谐并存的。
猜一下吧:
如果发现tbp0的上一行是,就把删掉。
是这个意思不?
Batcher 发表于 2011-6-5 22:25


是的

因为NSIS只能对横列文本作处理

所以我逻辑上解释不正确,很抱歉

就是这样处理
作者: leo198444    时间: 2011-6-5 22:37

额滴个神啊

这句很有趣

原来你们也会台湾国语
作者: CrLf    时间: 2011-6-6 12:32

既然两组关键词都是单字节字符,那可以这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. chcp 437 >nul
  3. (for /f "delims=" %%a in (leo1984.TXT) do (
  4. for /f "tokens=1*" %%b in ("!last!,%%a") do (
  5. if "%%b%%c" neq "<MATab>,<tabID>tbp0</tabID>" echo;!last!
  6. )
  7. set last=%%a
  8. )
  9. echo;!last!)>b.txt
  10. more +1 b.txt>a.txt
  11. pause
复制代码





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