标题: [文本处理] 批处理怎样读取字符串替换另外一个TXT文本中对应的字符串? [打印本页]
作者: TXTUSER 时间: 5 天前 21:11 标题: 批处理怎样读取字符串替换另外一个TXT文本中对应的字符串?
从《字典》TXT文本中读取字符串替换《原文》TXT文本中对应的字符串;
字典TXT
A=SIN(Y)
B=LOG(100)
C=TAN(Z)
D=COS(X)
以下N行省略...
原文TXT
AD=MAX(A,B)+MAX(C,D)
.....以下N行省略
结果的例子
AD=MAX(SIN(Y),LOG(100))+MAX(TAN(Z),COS(X))
作者: aloha20200628 时间: 5 天前 22:43
本帖最后由 aloha20200628 于 2024-11-1 15:10 编辑
回复 1# TXTUSER
匹配范围》原文.txt 每行可能出现的两种类型函数表达式中的一种,如下示例:
AD=MAX(A,B)+MAX(C,D)
XY=MIN(A,C)- @echo off &setlocal enabledelayedexpansion
- (for /f "tokens=1-6 delims=(,)" %%a in (
- 'findstr /i "([a-z][a-z]*,[a-z][a-z]*)" 《原文》.txt') do (
- set "s=%%a(_%%b,_%%c)" &if "%%d" neq "" set "s=!s!%%d(_%%e,_%%f)"
- for /f "tokens=1-2 delims==" %%x in (
- 'findstr /i "%%b= %%c= %%e= %%f=" 《字典》.txt') do set "s=!s:_%%x=%%y!"
- echo,!s!
- ))>"《原文》.new.txt" 2>nul
- type "《原文》.new.txt"
- endlocal&pause&exit/b
复制代码
作者: TXTUSER 时间: 5 天前 23:44
回复 TXTUSER
匹配范围》原文.txt 每行可能出现的两种类型函数表达式中的一种,如下示例:
AD= ...
aloha20200628 发表于 2024-10-31 22:43
原文不是单一的一行,有很多行算式
AD=MAX(A,B)+MAX(C,D)
SU=DC(OE+FC)
HI=SUM(A*OE)
文本内容很多,每行都是一个算式
字典业有很多条
A=SIN(Y)
B=LOG(100)
C=TAN(Z)
D=COS(X)
OE=POW(3)
FC=SQRT(6)
以下N行省略...
请老师再优化一下
作者: qixiaobin0715 时间: 4 天前 09:19
本帖最后由 qixiaobin0715 于 2024-11-1 09:30 编辑
回复 1# TXTUSER
你把原文txt放到网盘上,让大家帮你参谋参谋。
举例示范规律性不强,你自己又没说清楚。
作者: TXTUSER 时间: 4 天前 10:24
回复 4# qixiaobin0715 提示
附件上传不成功
作者: qixiaobin0715 时间: 4 天前 10:41
回复 5# TXTUSER
本论坛关闭了附件上传功能,我说的是网盘
作者: aloha20200628 时间: 4 天前 11:08
本帖最后由 aloha20200628 于 2024-11-1 15:17 编辑
回复 3# TXTUSER
二楼代码已订正如下,可以匹配3楼的示例样本了,目前设定可匹配1-4个圆括号运算项,设定每个运算项内可匹配1-2个变量...
- @echo off &setlocal enabledelayedexpansion
- (for /f "delims=" %%s in (《原文》.txt) do (
- set "s=%%s"
- for /f "tokens=1-8 delims=()" %%a in ("%%s") do (
- for %%i in ("%%b" "%%d" "%%f" "%%h") do (
- for /f "tokens=1-2 delims=,+-/*" %%1 in ("%%~i") do (
- set "v=%%1=" &if "%%2" neq "" set "v=!v! %%2="
- for /f "tokens=1-2 delims==" %%x in (
- 'findstr /i "!v!" 《字典》.txt'
- ) do set "s=!s:(%%x=(%%y!" &set "s=!s:%%x)=%%y)!")
- ))
- if "%%s" neq "!s!" echo,!s!
- ))>"《原文》.new.txt" 2>nul
- type "《原文》.new.txt"
- endlocal&pause&exit/b
复制代码
作者: Batcher 时间: 4 天前 12:50
回复 5# TXTUSER
如果需要上传文件,请用使用网盘。例如:
百度:https://pan.baidu.com
蓝奏:https://www.lanzou.com
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: idwma 时间: 4 天前 14:33
ps也来试一下- #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
- $aaaa='字典.txt'
- $bbbb='原文.txt'
- gc $aaaa|%{$cccc=$_ -split '=';iex('$'+$cccc[0]+'="'+$cccc[1]+'"')}
- (gc $bbbb)|%{
- [regex]::replace(
- $_,
- '(?<=\()[^)]+(?=\))',
- {
- [regex]::replace(
- $args[0].groups[0]-join'',
- '\w+',
- {iex('$'+$args[0].groups[0])}
- )
- }
- )
- }|sc $bbbb
复制代码
作者: Five66 时间: 4 天前 16:53
啊 ,这要想准确 ,应该得像编译器或解析器那样对原文件进行分词(Tokenization)吧 ,自己弄挺麻烦的 ,可以弄成C宏或m4宏 ,然后用对应的宏处理器进行替换
比如下面的 ,在mingw里用gawk将字典dic.txt替换换成C宏 ,然后用C宏处理程序对原文件yuanwen.txt进行处理的输出结果
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |