返回列表 发帖
回复 13# WHY
    @echo off
    REM 替换 D:\\Firefox106 为当前脚本路径
    set "p=%~dp0"
    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"
    pauseCOPY
这段代码中的【'%p:\=\\%'】似乎应该修改为【'\"%p:\=\\%'】,不然的话,少了个双引号。path的参数无法配对。
ps的-replace 参数好奇怪, 【-replace A,B】 把A替换成B,【'\"%p:\=\\%'】是Firefox106的路径,怎么没有把【Profiles\\\\extensions|browser\\\\features】一并替换掉呢?

TOP

回复 16# kidzgy


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

TOP

回复 12# WHY


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

TOP

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

回复 18# kidzgy


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

TOP

回复 15# kidzgy


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

TOP

回复 20# hfxiang

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

最终效果的代码是:
"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",COPY
谢谢!

TOP

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

先ECHO 看这样替换成功不 (没写入文件)
@if(0)==(0) @echo off
set "file=extensions.json"
set "oid=%cd%"
set "s=(?=\Profiles\extensions\|\browser\features\)"
cscript.exe -NoLogo -E:JScript %0  "%file%" "%s%" "%oid%"
PAUSE & exit/b
rem 保存为ANSI文件
@end
function adoLoadText(filename, charset) {
    stream = new ActiveXObject("ADODB.Stream");
    stream.type = 2;
    stream.charset = charset;
    stream.open();
    stream.loadFromFile(filename);
    text = stream.readText(-1);
    stream.close();
    return(text);
}
var s = WSH.Arguments.Item(1);
var p = WSH.Arguments.Item(2);
var file = WSH.Arguments.Item(0);
var jsontext =adoLoadText(file, "UTF-8");
var obj = new Function("return" + unescape(jsontext))();
var re = new RegExp(s.replace(/\\/g, "\\$&"));
var reg =new RegExp( '('+ '.+?' + ')'+ s.replace(/\\/g, "\\$&"));
for (var k  in obj) {var arr = obj[k] }
for (var i=0, len = arr.length;  i<len;i++) {
      var path=arr[i]["path"];
      if (re.test(path))
      {
           WSH.Echo( path.replace( reg, function($a,$b) { return( p ) } ) );
      }
}COPY

TOP

gawk 肯定可以的,毋庸置疑。不过,好多好多斜杠啊
http://bcn.bathome.net/tool/4.1.0/gawk.exe
@echo off
set "p=%~dp0"
gawk "{print $0=gensub(/(\"path\":\")[^^\"]+(Profiles\\\\extensions|browser\\\\features)/,\"\\1%p:\=\\\\\\\\%\\2\",\"g\")}" extensions.json > a.json
pauseCOPY

TOP

回复 22# terse


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

TOP

回复 8# Batcher


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

TOP

回复 23# WHY


    效果图是

TOP

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

回复 26# kidzgy


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

TOP

回复 27# WHY


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

TOP

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

回复 27# WHY


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

TOP

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

TOP

返回列表