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

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

本帖最后由 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字段的。多运行几次能达到目的即可
1

评分人数

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

本帖最后由 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] + '"'})
复制代码

TOP

回复 7# happy886rr


    sed 支持多种编码是什么情况

TOP

  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
复制代码

TOP

  1. powershell -c "$(type 'test.xml') -replace 'exp=\"[^^\"]*\"','exp=\"0\"' -replace 'fortune=\"[^^\"]*\"','fortune=\"1\"' -replace 'estate=\"[^^\"]*\"','estate=\"1\"'"
  2. pause
复制代码

TOP

回复 5# happy886rr

十分感谢

TOP

回复 3# 诗歌王位

十分感谢

TOP

回复 6# 诗歌王位
我也什么语言都不会,只会点批处理。sed是第三方,是Gnu win里的小工具。第三方的优势就是功能非常强悍,运行效率极高,节省你的思考成本。况且sed支持多种文本编码,没理由不用。

TOP

回复 5# happy886rr


    正则确实不错,但是考虑到新人求问,就用纯批处理解决了,诗歌本身实力其实也是一般。诗歌就相当于基础解答,你们就是高级解答,一个进阶过程,诗歌受教了,新人估计也是收获颇丰的。
          v_v

TOP

回复 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地址

TOP

正则匹配+替换

TOP

本帖最后由 诗歌王位 于 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

TOP

该段有多个需替换的字符,字符是未知的,而且文件编码ansi 或 utf8编码

TOP

返回列表