标题: [文本处理] 【已解决】批处理如何将文本里特定字符串中的指定内容替换成其他内容 [打印本页]
作者: 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 编辑
- @echo off && setlocal enabledelayedexpansion
- if exist 2.txt (del /f /q 2.txt)
- for /f "delims=" %%i in (1.txt) do (
- set "var=%%i"
- for /f tokens^=4^,6^,8delims^=^" %%a in ("!var!") do (
- set var=!var:%%a=0!
- set var=!var:%%b=1!
- set var=!var:%%c=1!
- echo !var!>>2.txt
- )
- )
复制代码
【代码分析】
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
别多运行几次,一次搞定就行了。- 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
- powershell -c "$(type 'test.xml') -replace 'exp=\"[^^\"]*\"','exp=\"0\"' -replace 'fortune=\"[^^\"]*\"','fortune=\"1\"' -replace 'estate=\"[^^\"]*\"','estate=\"1\"'"
- pause
复制代码
作者: pcl_test 时间: 2016-9-2 13:20
- mshta http://bathome.net/s/hta "type('test.xml').replace(/(exp=\"")[^""]*(\"")/g,'$10$2').replace(/(fortune=\"")[^""]*(\"")/g,'$11$2').replace(/(estate=\"")[^""]*(\"")/g,'$11$2')"
- pause
复制代码
作者: CrLf 时间: 2016-9-2 13:33
回复 7# happy886rr
sed 支持多种编码是什么情况
作者: WHY 时间: 2016-9-2 18:46
本帖最后由 WHY 于 2016-9-22 21:42 编辑
- $Hash = @{exp = '0'; fortune = '1'; estate = '1'};
- $str = [IO.File]::ReadAllText('D:\Test\1.txt', [Text.Encoding]::Default);
- $reg = [regex]'(?i)(exp|fortune|estate)="\d*"';
- $reg.Replace($str, {param($m); $m.Groups[1].Value + '="' + $Hash[$m.Groups[1].Value] + '"'})
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |