Board logo

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

作者: ccain    时间: 2016-8-28 09:09     标题: 【已解决】批处理如何将文本里特定字符串中的指定内容替换成其他内容

本帖最后由 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字段的。多运行几次能达到目的即可
作者: wskwfkbdn    时间: 2016-8-28 09:59

该段有多个需替换的字符,字符是未知的,而且文件编码ansi 或 utf8编码
作者: 诗歌王位    时间: 2016-8-28 17:24

本帖最后由 诗歌王位 于 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
作者: wskwfkbdn    时间: 2016-8-29 19:36

正则匹配+替换
作者: happy886rr    时间: 2016-8-29 20:58

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

回复 5# happy886rr


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

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

回复 3# 诗歌王位

十分感谢
作者: ccain    时间: 2016-9-2 12:54

回复 5# happy886rr

十分感谢
作者: pcl_test    时间: 2016-9-2 13:20

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

作者: pcl_test    时间: 2016-9-2 13:20

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

作者: CrLf    时间: 2016-9-2 13:33

回复 7# happy886rr


    sed 支持多种编码是什么情况
作者: WHY    时间: 2016-9-2 18:46

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





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