[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
gawk 肯定可以的,毋庸置疑。不过,好多好多斜杠啊
http://bcn.bathome.net/tool/4.1.0/gawk.exe
  1. @echo off
  2. set "p=%~dp0"
  3. gawk "{print $0=gensub(/(\"path\":\")[^^\"]+(Profiles\\\\extensions|browser\\\\features)/,\"\\1%p:\=\\\\\\\\%\\2\",\"g\")}" extensions.json > a.json
  4. pause
复制代码

TOP

本帖最后由 terse 于 2022-11-28 21:26 编辑

先ECHO 看这样替换成功不 (没写入文件)
  1. @if(0)==(0) @echo off
  2. set "file=extensions.json"
  3. set "oid=%cd%"
  4. set "s=(?=\Profiles\extensions\|\browser\features\)"
  5. cscript.exe -NoLogo -E:JScript %0  "%file%" "%s%" "%oid%"
  6. PAUSE & exit/b
  7. rem 保存为ANSI文件
  8. @end
  9. function adoLoadText(filename, charset) {
  10.     stream = new ActiveXObject("ADODB.Stream");
  11.     stream.type = 2;
  12.     stream.charset = charset;
  13.     stream.open();
  14.     stream.loadFromFile(filename);
  15.     text = stream.readText(-1);
  16.     stream.close();
  17.     return(text);
  18. }
  19. var s = WSH.Arguments.Item(1);
  20. var p = WSH.Arguments.Item(2);
  21. var file = WSH.Arguments.Item(0);
  22. var jsontext =adoLoadText(file, "UTF-8");
  23. var obj = new Function("return" + unescape(jsontext))();
  24. var re = new RegExp(s.replace(/\\/g, "\\$&"));
  25. var reg =new RegExp( '('+ '.+?' + ')'+ s.replace(/\\/g, "\\$&"));
  26. for (var k  in obj) {var arr = obj[k] }
  27. for (var i=0, len = arr.length;  i<len;i++) {
  28.       var path=arr[i]["path"];
  29.       if (re.test(path))
  30.       {
  31.            WSH.Echo( path.replace( reg, function($a,$b) { return( p ) } ) );
  32.       }
  33. }
复制代码

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

回复 15# kidzgy


   
所谓“重置”,无非是部分“删除”、“替换”以及“插入”,对吧?请把前后对照摆出来,awk或sed就为此而生的

TOP

本帖最后由 WHY 于 2022-12-15 10:43 编辑

回复 18# kidzgy


    12楼仅仅是示例,可以无视。这样即可:
  1. (?<="path":")(?:(?!"path":").)*(?=Profiles\\\\extensions|browser\\\\features)
复制代码

TOP

回复 12# WHY


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

TOP

回复 16# kidzgy


    确实,少加了一个双引号。
  1. (?=Profiles\\\\extensions|browser\\\\features)
复制代码
  1. (?:Profiles\\\\extensions|browser\\\\features)
复制代码
是有区别的

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

回复  kidzgy


   

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



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

TOP

提取含browser\features\ 关键词的路径
  1. @if(0)==(0) @echo off
  2. set "file=extensions.json"
  3. set "s=\browser\features\"
  4. cscript.exe -NoLogo -E:JScript %0  "%file%" "%s%"
  5. PAUSE & exit/b
  6. rem 保存为ANSI文件
  7. @end
  8. function adoLoadText(filename, charset) {
  9.     stream = new ActiveXObject("ADODB.Stream");
  10.     stream.type = 2;
  11.     stream.charset = charset;
  12.     stream.open();
  13.     stream.loadFromFile(filename);
  14.     text = stream.readText(-1);
  15.     stream.close();
  16.     return(text);
  17. }
  18. var file = WSH.Arguments.Item(0);
  19. var jsontext =adoLoadText(file, "UTF-8");
  20. var obj = new Function("return" + unescape(jsontext))();
  21. var re = new RegExp(WSH.Arguments.Item(1).replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
  22. for (var k  in obj) {var arr = obj[k] }
  23. for (var i=0, len = arr.length;  i<len;i++) {
  24.       var path=arr[i]["path"]
  25.       if (re.test(path))  {WSH.Echo(path)}
  26. }
复制代码

TOP

本帖最后由 WHY 于 2022-12-15 10:44 编辑
  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
复制代码
Test.ps1
  1. #替换 D:\\Firefox106 为当前当前脚本路径
  2. #需PowerShell v3.0及以上版本
  3. $MyPath = $MyInvocation.MyCommand.Path -replace '\\[^\\]+$', '\';
  4. $json = gc -Literal ($MyPath + 'extensions.json') -Raw -Enc utf8 | ConvertFrom-Json;
  5. forEach( $obj In $json.addons ){
  6.     $path = $obj.path -replace '^.*?\\(?=Profiles\\extensions|browser\\features)', $MyPath;
  7.     $obj.path = $path;
  8. }
  9. $json | ConvertTo-Json -Depth 10 | sc -Literal ($MyPath + 'Result.json') -Enc utf8;
复制代码

TOP

要用到所谓的"零宽断言"才能实现,不知道 fr.exe 支不支持
在 UltraEdit 中,选替换
正则选
  1. ^.*?("path":(?:(?!"path":).)*\\\\browser\\\\features).*$
复制代码
替换为选 \1
正则勾选 Perl

TOP

回复 10# terse

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

TOP

既然是json文件,那就按json处理呢?不用正则应该可以,如有样本可以试一下

TOP

回复 7# Batcher


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

TOP

返回列表