[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理如何替换特殊格式文本文件中的特定行?

有一文本文件MANIFEST.MF,内容如下
  1. Manifest-Version: 1.0
  2. Ant-Version: Apache Ant 1.7.0
  3. Created-By: 14.1-b02 (Sun Microsystems Inc.)
  4. Bundle-ManifestVersion: 2
  5. Bundle-Name: %bundleName
  6. Bundle-SymbolicName: com.cnex.oss.bss.handleconsignment.client; single
  7. ton:=true
  8. [color=Red]Bundle-Version: 3.3.70.build2012050612[/color]Bundle-Activator: com.cnex.oss.bss.handleconsignment.client.Activator
  9. Bundle-Vendor: %bundleVendor
  10. Bundle-Localization: plugin
  11. Require-Bundle: org.eclipse.ui,org.eclipse.core.runtime,com.cnex.org.a
  12. pache.commons.eclipse,com.cnex.org.apache.log4j.eclipse,com.cnex.org.
  13. hibernate.eclipse,com.cnex.org.springframework.eclipse,com.cnex.oss.c
  14. lient,com.cnex.oss.framework,com.cnex.oss.framework.eclipse,com.cnex.
  15. oss.model,org.junit4,com.cnex.org.eclipse.ui.widgets.imageviewer,com.
  16. cnex.oss.model.service,com.cnex.nebula.datetimer,com.cnex.oss.model.u
  17. cservice
  18. Eclipse-LazyStart: true
  19. Eclipse-RegisterBuddy: com.cnex.org.springframework.eclipse,com.cnex.o
  20. rg.apache.log4j.eclipse,com.cnex.org.apache.derby.eclipse.client,com.
  21. cnex.org.hibernate.eclipse,com.cnex.org.apache.commons.eclipse
  22. Export-Package: com.cnex.oss.bss.handleconsignment.client,com.cnex.oss
  23. .bss.handleconsignment.client.context.strategy,com.cnex.oss.bss.handl
  24. econsignment.newclient.controller,com.cnex.oss.bss.handleconsignment.
  25. newclient.helper,com.cnex.oss.bss.handleconsignment.newclient.ui.view
  26. ; uses:="org.eclipse.jface.window,  com.cnex.oss.model.business.cargo
  27. ,  com.cnex.oss.client.view,  org.eclipse.swt.events,  org.eclipse.sw
  28. t.custom,  com.cnex.oss.client.cooperate,  com.cnex.org.eclipse.ui.wi
  29. dgets.imageviewer,  com.cnex.oss.bss.handleconsignment.newclient.acti
  30. ons,  org.eclipse.jface.action,  org.eclipse.swt.graphics,  org.eclip
  31. se.jface.viewers,  com.cnex.nebula.datetimer,  org.eclipse.swt.widget
  32. s,  com.cnex.oss.model.resource.person"
复制代码
红色字段部分是需要替换的内容,可以确定的是Bundle-Version: 行开始时需要替换的内容,后面是文件版本号,数字不确定。如何替换该行的内容。

用如下代码进行读取内容发现
  1. for /f  "tokens=*" %%b in (MANIFEST.MF) do (
  2. set bb=%%b
  3. .............................
  4. echo !bb!>>MANIFEST1.MF
  5. )
复制代码
若是已空格开头的行写入新文件后,空格开头的行空格丢失了
还有行:
; uses:="org.eclipse.jface.window,  com.cnex.oss.model.business.cargo
在用以上方式写入新文件中是也丢失了
1

评分人数

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

那位大侠可以帮看看啊??

TOP

  1. @echo off &setlocal enabledelayedexpansion
  2. set Bundle-Version=Bundle-Version: 3.3.70
  3. for /f  "tokens=*" %%k in (MANIFEST.MF) do (
  4. set kk=%%k
  5. if "!kk:~0,15!" equ "Bundle-Version:" set kk=%Bundle-Version%
  6. echo !kk!>>MANIFEST1.MF
复制代码
用该脚本执行后有2个问题
1.MANIFEST.MF文件已空格开头的行在写入MANIFEST1.MF文件后,空格没有了
2. 原来文件行
; uses:="org.eclipse.jface.window,  com.cnex.oss.model.business.cargo
在新的文件MANIFEST1.MF中没有写入。
望高手指点下啊

TOP

修改代码
  1. @echo off &setlocal enabledelayedexpansion
  2. set Bundle-Version=Bundle-Version: 3.3.70
  3. for /f  "tokens=* delims=" %%k in (MANIFEST.MF) do (
  4. set kk=%%k
  5. if "!kk:~0,15!" equ "Bundle-Version:" set kk=%Bundle-Version%
  6. echo !kk!>>MANIFEST1.MF
复制代码
原来的问题解决
有人可以告诉我2段代码有无delims=的区别呢?

TOP

for/f处理文本时,默认会忽略空行和以分号打头的行,默认会取第1列,默认以空格和tab作为分隔符,用tokens=*,表示取所有列,但若开头有空格,会把开头的若干空格去掉,因为开头的空格被当成了分隔符;要保全所有该行所有内容,应用delims=,即不设定分隔符。比较保险的写法为:
  1. for /f "eol= delims=" %%i in (a.txt) do ...
复制代码
如果要考虑保留文本中空行的情况,则还要用上findstr或其他方法,总之用批处理做文本处理还是稍显麻烦。
本人处理文本,首先考虑用sed,如果不方便再考虑用awk,最后才考虑用纯批处理。这里用sed则不需要考虑这么多:
  1. sed -i "/^Bundle-Version/c\Bundle-Version:3.3.70" MANIFEST.MF
复制代码
1

评分人数

看得多说得多,远比不上写得多。

TOP

红色字段在哪里呢??

TOP

非常感谢weichenxiehou 大侠的帮助。

TOP

返回列表