标题: [文本处理] [已解决]批处理如何替换特殊格式文本文件中的特定行? [打印本页]
作者: mjh77_77 时间: 2012-6-6 16:50 标题: [已解决]批处理如何替换特殊格式文本文件中的特定行?
有一文本文件MANIFEST.MF,内容如下- Manifest-Version: 1.0
- Ant-Version: Apache Ant 1.7.0
- Created-By: 14.1-b02 (Sun Microsystems Inc.)
- Bundle-ManifestVersion: 2
- Bundle-Name: %bundleName
- Bundle-SymbolicName: com.cnex.oss.bss.handleconsignment.client; single
- ton:=true
- [color=Red]Bundle-Version: 3.3.70.build2012050612[/color]Bundle-Activator: com.cnex.oss.bss.handleconsignment.client.Activator
- Bundle-Vendor: %bundleVendor
- Bundle-Localization: plugin
- Require-Bundle: org.eclipse.ui,org.eclipse.core.runtime,com.cnex.org.a
- pache.commons.eclipse,com.cnex.org.apache.log4j.eclipse,com.cnex.org.
- hibernate.eclipse,com.cnex.org.springframework.eclipse,com.cnex.oss.c
- lient,com.cnex.oss.framework,com.cnex.oss.framework.eclipse,com.cnex.
- oss.model,org.junit4,com.cnex.org.eclipse.ui.widgets.imageviewer,com.
- cnex.oss.model.service,com.cnex.nebula.datetimer,com.cnex.oss.model.u
- cservice
- Eclipse-LazyStart: true
- Eclipse-RegisterBuddy: com.cnex.org.springframework.eclipse,com.cnex.o
- rg.apache.log4j.eclipse,com.cnex.org.apache.derby.eclipse.client,com.
- cnex.org.hibernate.eclipse,com.cnex.org.apache.commons.eclipse
- Export-Package: com.cnex.oss.bss.handleconsignment.client,com.cnex.oss
- .bss.handleconsignment.client.context.strategy,com.cnex.oss.bss.handl
- econsignment.newclient.controller,com.cnex.oss.bss.handleconsignment.
- newclient.helper,com.cnex.oss.bss.handleconsignment.newclient.ui.view
- ; uses:="org.eclipse.jface.window, com.cnex.oss.model.business.cargo
- , com.cnex.oss.client.view, org.eclipse.swt.events, org.eclipse.sw
- t.custom, com.cnex.oss.client.cooperate, com.cnex.org.eclipse.ui.wi
- dgets.imageviewer, com.cnex.oss.bss.handleconsignment.newclient.acti
- ons, org.eclipse.jface.action, org.eclipse.swt.graphics, org.eclip
- se.jface.viewers, com.cnex.nebula.datetimer, org.eclipse.swt.widget
- s, com.cnex.oss.model.resource.person"
复制代码
红色字段部分是需要替换的内容,可以确定的是Bundle-Version: 行开始时需要替换的内容,后面是文件版本号,数字不确定。如何替换该行的内容。
用如下代码进行读取内容发现- for /f "tokens=*" %%b in (MANIFEST.MF) do (
- set bb=%%b
- .............................
- echo !bb!>>MANIFEST1.MF
- )
复制代码
若是已空格开头的行写入新文件后,空格开头的行空格丢失了
还有行:
; uses:="org.eclipse.jface.window, com.cnex.oss.model.business.cargo
在用以上方式写入新文件中是也丢失了
作者: mjh77_77 时间: 2012-6-6 17:10
那位大侠可以帮看看啊??
作者: mjh77_77 时间: 2012-6-6 17:43
- @echo off &setlocal enabledelayedexpansion
- set Bundle-Version=Bundle-Version: 3.3.70
- for /f "tokens=*" %%k in (MANIFEST.MF) do (
- set kk=%%k
- if "!kk:~0,15!" equ "Bundle-Version:" set kk=%Bundle-Version%
- echo !kk!>>MANIFEST1.MF
复制代码
用该脚本执行后有2个问题
1.MANIFEST.MF文件已空格开头的行在写入MANIFEST1.MF文件后,空格没有了
2. 原来文件行
; uses:="org.eclipse.jface.window, com.cnex.oss.model.business.cargo
在新的文件MANIFEST1.MF中没有写入。
望高手指点下啊
作者: mjh77_77 时间: 2012-6-6 17:52
修改代码- @echo off &setlocal enabledelayedexpansion
- set Bundle-Version=Bundle-Version: 3.3.70
- for /f "tokens=* delims=" %%k in (MANIFEST.MF) do (
- set kk=%%k
- if "!kk:~0,15!" equ "Bundle-Version:" set kk=%Bundle-Version%
- echo !kk!>>MANIFEST1.MF
复制代码
原来的问题解决
有人可以告诉我2段代码有无delims=的区别呢?
作者: weichenxiehou 时间: 2012-6-6 18:33
for/f处理文本时,默认会忽略空行和以分号打头的行,默认会取第1列,默认以空格和tab作为分隔符,用tokens=*,表示取所有列,但若开头有空格,会把开头的若干空格去掉,因为开头的空格被当成了分隔符;要保全所有该行所有内容,应用delims=,即不设定分隔符。比较保险的写法为:- for /f "eol= delims=" %%i in (a.txt) do ...
复制代码
如果要考虑保留文本中空行的情况,则还要用上findstr或其他方法,总之用批处理做文本处理还是稍显麻烦。
本人处理文本,首先考虑用sed,如果不方便再考虑用awk,最后才考虑用纯批处理。这里用sed则不需要考虑这么多:- sed -i "/^Bundle-Version/c\Bundle-Version:3.3.70" MANIFEST.MF
复制代码
作者: poter 时间: 2012-6-6 21:03
红色字段在哪里呢??
作者: mjh77_77 时间: 2012-6-7 10:28
非常感谢weichenxiehou 大侠的帮助。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |