[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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外的第三方命令工具,如果是其他第三方工具命令行内容该如何填写?

回复 2# hfxiang


    sed似乎不支持懒惰模式。

TOP


或者我换种提法,以【\\browser\\features】为基准,怎么向前匹配最近的一个【path】?如图所示,红色区域是我最终想匹配的内容。
为什么我这里懒惰匹配,还能匹配到最开头的【path】?
  1. (?<=path\"\:\").*?(\\\\browser\\\\features).*?
复制代码
  1. "path":"D:\\Firefox106\\Profiles\\extensions\\s3google@translator.xpi","path":"D:\\Firefox106\\browser\\features\\screenshots@mozilla.org.xpi"
复制代码

TOP

回复 7# Batcher


    感谢解答!这个绝了,用逗号做分割。我有个疑问,假设分割的不是逗号,而是apple这个词组或某个句子,那么这个【[^,]+】应该怎么写?

TOP

回复 10# terse

json样本
https://wwi.lanzoup.com/ifb2r0h3ap1c

TOP

回复  kidzgy


   

下载gawk(  )
执行结果
hfxiang 发表于 2022-11-28 09:46



   您好!这个似乎是搞错了,不是提取json的path路径哦,是还要针对 D:\firefox106 进行重置路径。不知道gawk能直接修改吗?

TOP

回复 13# WHY
  1.     @echo off
  2.     REM 替换 D:\\Firefox106 为当前脚本路径
  3.     set "p=%~dp0"
  4.     PowerShell "$arr = (gc -Literal '%~dp0extensions.json' -Enc UTF8 -ReadCount 0) -replace '(?<=\"path\":)(?:(?!\"path\":).)*(?=Profiles\\\\extensions|browser\\\\features)', '%p:\=\\%'; sc -Literal '%~dp0Result.json' -Value $arr -Enc UTF8"
  5.     pause
复制代码
这段代码中的【'%p:\=\\%'】似乎应该修改为【'\"%p:\=\\%'】,不然的话,少了个双引号。path的参数无法配对。
ps的-replace 参数好奇怪, 【-replace A,B】 把A替换成B,【'\"%p:\=\\%'】是Firefox106的路径,怎么没有把【Profiles\\\\extensions|browser\\\\features】一并替换掉呢?

TOP

回复 12# WHY


    刚刚试了一下,fr不支持,不过这个语句在regex101,提示回溯过多

TOP

回复 20# hfxiang

源代码是:
  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",
复制代码
假设我当前文件夹是【E:\FF\Firefox107】(注:当前路径是变量,是任意路径)
要做的就是把【D:\\Firefox106】变为【E:\FF\Firefox107】

最终效果的代码是:
  1. "path":"E:\\FF\\Firefox107\\Profiles\\extensions\\s3google@translator.xpi","path":"E:\\FF\\Firefox107\\browser\\features\\screenshots@mozilla.org.xpi",,"path":"E:\\FF\\Firefox107\\browser\\features\\webcompat@mozilla.org.xpi",
复制代码
谢谢!

TOP

回复 22# terse


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

TOP

回复 8# Batcher


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

TOP

回复 23# WHY


    效果图是

TOP

回复 27# WHY


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

TOP

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

回复 27# WHY


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

TOP

回复 30# terse


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

TOP

返回列表