使用jrepl批量替换时遇‘搜索替换/T表达式不匹配’错误求助
解决JRepl整合替换规则时的"Mismatched search and replace /T expressions"错误
原多命令替换实现
原本通过多条JRepl命令完成各类字符替换,代码如下:
call "jrepl.bat" "\xE2\x80\x9D \xE2\x80\x9C" "\x22\x22 \x22\x22" /x /l /t " " /f "%Curdir%\%marca%Consolidado-OK.csv" /o - call "jrepl.bat" "\xE2\x80\x93 \xE2\x80\x94" "- -" /x /l /t " " /f "%Curdir%\%marca%Consolidado-OK.csv" /o - call "jrepl.bat" "\xE2\x80\x99" "'" /x /f "%Curdir%\%marca%Consolidado-OK.csv" /o - call "jrepl.bat" "\xE2\x84\xA2" "(TM)" /x /f "%Curdir%\%marca%Consolidado-OK.csv" /o - call "jrepl.bat" "\xC2\xB0" " grados" /x /f "%Curdir%\%marca%Consolidado-OK.csv" /o - call "jrepl.bat" "\xC3\xA1 \xC3\xA9 \xC3\xAD \xC3\xB3 \xC3\xBA \xC3\xB1" "a e i o u n" /x /l /t " " /f "%Curdir%\%marca%Consolidado-OK.csv" /o - call "jrepl.bat" "\xC3\x81 \xC3\x89 \xC3\x8D \xC3\x93 \xC3\x9A \xC3\x91" "A E I O U N" /x /l /t " " /f "%Curdir%\%marca%Consolidado-OK.csv" /o -
整合替换规则的尝试
为简化操作,将所有替换规则整合到以#分隔的reemplazos变量中:
set "reemplazos=\xE2\x80\x9D \xE2\x80\x9C=\x22\x22 \x22\x22#\xE2\x80\x93 \xE2\x80\x94=- -#\xE2\x80\x99='#\xE2\x84\xA2=(TM)#\xC2\xB0= grados#\xC3\xA1 \xC3\xA9 \xC3\xAD \xC3\xB3 \xC3\xBA \xC3\xB1=a e i o u n#\xC3\x81 \xC3\x89 \xC3\x8D \xC3\x93 \xC3\x9A \xC3\x91=A E I O U N"
随后调用单条JRepl命令时出现报错:
call "jrepl.bat" "%reemplazos%" "$txt=$0.replace(/(?<=\#)?([^#]+)(?=\#)?/g,function(m,g1){return g1.split('=')[1]})" /jq /t "#" /x /f "%CurDir%\%marca%Consolidado-OK.csv" /o -
错误信息:
JScript runtime error: Mismatched search and replace /T expressions
错误原因
/t "#"参数的作用是让JRepl将搜索表达式和替换表达式分别按#拆分成多组,要求两组拆分后的数量完全匹配。但你当前的用法是把所有规则塞进搜索表达式,替换表达式是一段JS脚本,拆分后搜索项数量远多于替换项,导致匹配失败,触发错误。
解决方法
放弃/t "#"参数,改用JScript脚本直接解析替换规则并批量处理。以下两种方案都可以实现需求:
方案1:直接在脚本中定义替换映射
call "jrepl.bat" "^.*$" " // 定义所有替换规则的键值对 var replacements = { '\u201D \u201C': '"" ""', '\u2013 \u2014': '- -', '\u2019': "'", '\u2122': '(TM)', '\u00B0': ' grados', '\u00E1 \u00E9 \u00ED \u00F3 \u00FA \u00F1': 'a e i o u n', '\u00C1 \u00C9 \u00CD \u00D3 \u00DA \u00D1': 'A E I O U N' }; var txt = $0; // 遍历所有规则执行替换 for (var key in replacements) { // 转义正则特殊字符,避免匹配异常 var regex = new RegExp(key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'); txt = txt.replace(regex, replacements[key]); } return txt; " /jq /x /f "%CurDir%\%marca%Consolidado-OK.csv" /o -
方案2:解析预定义的reemplazos变量
如果希望保留reemplazos变量的定义,可在脚本中拆分并解析规则:
set "reemplazos=\xE2\x80\x9D \xE2\x80\x9C=\x22\x22 \x22\x22#\xE2\x80\x93 \xE2\x80\x94=- -#\xE2\x80\x99='#\xE2\x84\xA2=(TM)#\xC2\xB0= grados#\xC3\xA1 \xC3\xA9 \xC3\xAD \xC3\xB3 \xC3\xBA \xC3\xB1=a e i o u n#\xC3\x81 \xC3\x89 \xC3\x8D \xC3\x93 \xC3\x9A \xC3\x91=A E I O U N" call "jrepl.bat" "^.*$" " var rules = '%reemplazos%'.split('#'); var txt = $0; for (var i=0; i<rules.length; i++) { var parts = rules[i].split('='); if (parts.length === 2) { var searchStr = parts[0]; var replaceStr = parts[1]; // 转义正则特殊字符 var regex = new RegExp(searchStr.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'); txt = txt.replace(regex, replaceStr); } } return txt; " /jq /x /f "%CurDir%\%marca%Consolidado-OK.csv" /o -
两种方案均会遍历所有替换规则,对目标文件内容一次性完成所有替换操作,效率与原多命令方式一致,但代码更简洁。
内容的提问来源于stack exchange,提问作者Mikel Urbieta
相关产品推荐
相关产品推荐

