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

[其他] 【已解决】fr.exe(find - replace)的正则匹配问题

本帖最后由 kidzgy 于 2022-11-29 19:15 编辑

fr文件http://bcn.bathome.net/tool/2.1.7.0424/fr.exe
fr文件操作说明:http://baiy.cn/utils/fr/index.htm
正则测试文件(文件名为extensions.json,全文单行内容)https://pastebin.ubuntu.com/p/QfgD7xzntJ/plain/
正则测试主要内容(源测试文件内容较多,将无关内容去除后的主要内容)
  1. "path":"D:\\Firefox106\\Profiles\\extensions\\s3google@translator.xpi","path":"D:\\Firefox106\\browser\\features\\screenshots@mozilla.org.xpi",,"path":"D:\\Firefox106\\browser\\features\\webcompat@mozilla.org.xpi",
复制代码
正则测试语句:
  1. \"path\"\:\".*?\\\\(browser\\\\features|Profiles\\\\extensions).*?
复制代码
要点:
  1. (1)【D:\\Firefox106】路径不唯一,它可以是任何路径,任意文件夹名。fr的最终目的就是,不管当前路径如何,在fr.exe后,重新刷新为当前路径。比如,当前路径是【D:\\Firefox106】,但我又把Firefox106文件夹放到【C:\123】在fr.exe,那路径就该是【C:\123\Firefox106】。
  2. (2)在用 regex101.com 测试的时候,通过上述测试语句搜索,匹配的内容是【D:\\Firefox106\\Profiles\\extensions】或【D:\\Firefox106\\browser\\features】
复制代码
,并且将【Profiles\\extensions】或【browser\\features】设置为【组1(即\1)】。

我在regex101测试内容截图:



我的批处理命令行内容如下:
  1. @ECHO OFF&(PUSHD "%~DP0")
  2. set firefox=%~DP0
  3. set firefox1=%firefox:\=/%
  4. set firefox2=%firefox:\=\\\\%
  5. fr.exe "extensions.json" -ric:"***:file:\/\/\/.*?\/(Profiles\/extensions|browser\/features).*?" -t:"file:///%firefox1%\1"
  6. fr.exe "extensions.json" -ric:"***:\"path\"\:\".*?\\\\(browser\\\\features|Profiles\\\\extensions).*?" -t:""path":"%firefox2%\1"
复制代码
发现 第一条fr.exe 这条语句是可以成功替换的,但是第二条 fr.exe 则是替换失败,本帖的内容就是讨论第二条的执行问题,不知道原因在哪里?

请问,语句应该怎么修改?或者是否必须使用fr外的第三方命令工具,如果是其他第三方工具命令行内容该如何填写?

回复 36# terse

我知道是什么原因了,是我火狐浏览器的问题,107版本在复制时,会有【<0xa0>】 的特别空白符,导致批处理运行失败。在106版本或换成EDGE浏览器时则无此情况,这应该是火狐107独有的BUG。
   

TOP

回复 35# kidzgy
我这边测试的是你发的extensions.json文件,都通过测试,系统win10
会不会文件编码问题

TOP

回复 34# terse


    第二段代码提示(UTF-8编码)
  1. 输入错误: 无法找到脚本文件“D:\Firefox107 - 副本\profiles\123.bat聽聽extensions.json”。
复制代码
或者(GBK编码或ANSI编码)
  1. CScript 错误: 加载脚本“D:\Firefox107 - 副本\profiles\123.bat??extensions.json”失败(文件名、目录名 或卷标语法不正确。 )。
复制代码

TOP

回复 33# kidzgy
直接正则替换效率提高的  练手一下
PS
  1. <# :
  2. @echo off
  3. PowerShell -NoProfile -C ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\"))"
  4. pause & exit/b
  5. #>
  6. $oid = [Io.Directory]::GetCurrentDirectory() -replace '\\','\\'
  7. $pat = '(?<="path":")[^"]+(?=\\\\Profiles\\\\extensions\\\\|\\\\browser\\\\features\\\\)'
  8. $(gc extensions.json -Raw -Encoding UTF8) -replace $pat , $oid | sc 'extensions.json' -Encoding UTF8
复制代码
JS代码长,效率不低
  1. @if(0)==(0) @echo off
  2. set "file=extensions.json"
  3. set "ph=%~dp0"
  4. cscript.exe -NoLogo -E:JScript %0  "%file%" "%ph:~,-1%"
  5. PAUSE & exit/b
  6. @end
  7. function adoLoadText(filename, charset) {
  8.     stream = new ActiveXObject("ADODB.Stream");
  9.     stream.type = 2;
  10.     stream.charset = charset;
  11.     stream.open();
  12.     stream.loadFromFile(filename);
  13.     text = stream.readText(-1);
  14.     stream.close();
  15.     return(text);
  16. }
  17. function adoSaveText(filename, text) {
  18.   var stream;
  19.   stream = new ActiveXObject("ADODB.Stream");
  20.   stream.type = 2;
  21.   stream.charset ='utf-8';
  22.   stream.open();
  23.   stream.writeText(text);
  24.   stream.saveToFile(filename, 2);
  25.   stream.close();
  26. }
  27. var file = WSH.Arguments.Item(0);
  28. var p = WSH.Arguments.Item(1).replace(/\\/g,"\\\\");
  29. var jsontext =adoLoadText(file, "UTF-8");
  30. var re =/("path":")[^"]+(?=\\\\Profiles\\\\extensions\\\\|\\\\browser\\\\features\\\\)/ig;
  31. adoSaveText('extensions.json',jsontext.replace( re, function($a,$b ) {return($b+p)}));
复制代码

TOP

回复 31# WHY


    感谢!!现在是更加完善了!

TOP

回复 30# terse


    这个管用,谢谢!感觉ps比bat+第三方复杂好多!

TOP

回复 29# kidzgy


    比如,把 1.txt 中的 abc 改成 xyz
  1. gawk -v "IGNORECASE=1" "{print $0=gensub(/abc/,\"xyz\",\"g\")>\"1.txt\"}" 1.txt
复制代码

TOP

Ps
  1. <# :
  2. @echo off
  3. PowerShell -NoProfile -C ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\"))"
  4. pause & exit/b
  5. #>
  6. $oid = [Io.Directory]::GetCurrentDirectory()
  7. $jointxt =  @(CAT .\extensions.json  -Encoding UTF8)|ConvertFrom-Json
  8. $pat ='^.*?\\(?=Profiles\\extensions|browser\\features)'
  9. for ( $i=0; $i -lt $jointxt.addons.Count;$i++) {
  10.     $jointxt.addons[$i].path = $jointxt.addons[$i].path -replace $pat,$oid
  11. }
  12. $jointxt|ConvertTo-Json |  sc 'New_extensions.json' -Encoding UTF8
复制代码

TOP

本帖最后由 kidzgy 于 2022-11-29 02:09 编辑

回复 27# WHY


    请教一下,gawk有没有办法直接修改源文件,而不是再生成新文件?另外,如何开启忽略大小写?

TOP

回复 27# WHY


是哈,是我大意了!感谢!非常完美!

TOP

本帖最后由 WHY 于 2022-11-28 21:59 编辑

回复 26# kidzgy


    set "p=%~dp0"
这一句你丢了,并且要存为bat脚本文件运行

TOP

回复 23# WHY


    效果图是

TOP

回复 8# Batcher


对源文件 sed处理后的效果是这样的

TOP

回复 22# terse


    这个替换成功!如果要写入文件的话不知怎么处理呢?

TOP

返回列表