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

[文本处理] 【已解决】批处理如何将文本里特定字符串中的指定内容替换成其他内容

[复制链接]
发表于 2016-8-28 09:09:22 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-9-2 14:25 编辑

求可将一个随机可变数值替换为固定值的批处理文件
源文件:<Level LV="1" exp="71267" fortune="100000" estate="8000" ap="100" member="10" job1="0" job2="0" job3="0" job4="1" consume="6000" />
            <Level LV="2" exp="75217" fortune="108000" estate="8000" ap="110" member="12" job1="0" job2="0" job3="0" job4="1" consume="9000" />
            ......很多行
替换为:<Level LV="1" exp="0" fortune="1" estate="1" ap="100" member="10" job1="0" job2="0" job3="0" job4="1" consume="6000" />
            <Level LV="2" exp="0" fortune="1" estate="1" ap="110" member="12" job1="0" job2="0" job3="0" job4="1" consume="9000" />

注“是一个XML文件中的一段,编码是ANSI”
大神能否先给出只改exp="0"这个字段的代码。等exp字段改好之后,我在把代码换成改fortune字段的。多运行几次能达到目的即可

评分

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

查看全部评分

发表于 2016-8-28 09:59:31 | 显示全部楼层
该段有多个需替换的字符,字符是未知的,而且文件编码ansi 或 utf8编码
发表于 2016-8-28 17:24:16 | 显示全部楼层
本帖最后由 诗歌王位 于 2016-8-28 17:25 编辑

  1. @echo off && setlocal enabledelayedexpansion
  2. if exist 2.txt (del /f /q 2.txt)
  3. for /f "delims=" %%i in (1.txt) do (
  4. set "var=%%i"
  5. for /f tokens^=4^,6^,8delims^=^" %%a in ("!var!") do (
  6. set var=!var:%%a=0!
  7. set var=!var:%%b=1!
  8. set var=!var:%%c=1!
  9. echo !var!>>2.txt
  10. )
  11. )
复制代码
【代码分析】
1.注意源文件为1.txt;替换文件为2.txt
2.exp=“0”的字段是通过delims=“分段的,这里用了转义字符,自己看看应该能知道tokens=4应该是对应exp=“71267”中的71267
发表于 2016-8-29 19:36:18 | 显示全部楼层
正则匹配+替换
发表于 2016-8-29 20:58:15 | 显示全部楼层
回复 1# ccain
别多运行几次,一次搞定就行了。
  1. sed -i "s/exp="[0-9]*"/exp="0"/g";"s/fortune="[0-9]*"/fortune="1"/g";"s/estate="[0-9]*"/estate="1"/g" a.txt
复制代码
用到第三方sed地址
发表于 2016-8-30 08:30:39 | 显示全部楼层
回复 5# happy886rr


    正则确实不错,但是考虑到新人求问,就用纯批处理解决了,诗歌本身实力其实也是一般。诗歌就相当于基础解答,你们就是高级解答,一个进阶过程,诗歌受教了,新人估计也是收获颇丰的。
          v_v
发表于 2016-8-30 08:59:17 | 显示全部楼层
回复 6# 诗歌王位
我也什么语言都不会,只会点批处理。sed是第三方,是Gnu win里的小工具。第三方的优势就是功能非常强悍,运行效率极高,节省你的思考成本。况且sed支持多种文本编码,没理由不用。
 楼主| 发表于 2016-9-2 12:53:46 | 显示全部楼层
回复 3# 诗歌王位

十分感谢
 楼主| 发表于 2016-9-2 12:54:11 | 显示全部楼层
回复 5# happy886rr

十分感谢
发表于 2016-9-2 13:20:23 | 显示全部楼层
  1. powershell -c "$(type 'test.xml') -replace 'exp="[^^"]*"','exp="0"' -replace 'fortune="[^^"]*"','fortune="1"' -replace 'estate="[^^"]*"','estate="1"'"
  2. pause
复制代码
发表于 2016-9-2 13:20:47 | 显示全部楼层
  1. mshta http://bathome.net/s/hta "type('test.xml').replace(/(exp="")[^""]*("")/g,'$10$2').replace(/(fortune="")[^""]*("")/g,'$11$2').replace(/(estate="")[^""]*("")/g,'$11$2')"
  2. pause
复制代码
发表于 2016-9-2 13:33:15 | 显示全部楼层
回复 7# happy886rr


    sed 支持多种编码是什么情况
发表于 2016-9-2 18:46:13 | 显示全部楼层
本帖最后由 WHY 于 2016-9-22 21:42 编辑
  1. $Hash = @{exp = '0'; fortune = '1'; estate = '1'};
  2. $str = [IO.File]::ReadAllText('D:\Test\1.txt', [Text.Encoding]::Default);
  3. $reg = [regex]'(?i)(exp|fortune|estate)="\d*"';
  4. $reg.Replace($str, {param($m); $m.Groups[1].Value + '="' + $Hash[$m.Groups[1].Value] + '"'})
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 10:20 , Processed in 0.023270 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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