返回列表 发帖

[问题求助] [已解决]请教PowerShell怎样匹配替换有特定规律的文本

本帖最后由 smss 于 2022-10-15 23:24 编辑
2501  GA106 [GeForce RTX 3060]
2503  GA106 [GeForce RTX 3060]
2504  GA106 [GeForce RTX 3060 Lite Hash Rate]
2505  GA106
2507  GA106 [Geforce RTX 3050]
2508  GA106 [GeForce RTX 3050 OEM]
2520  GA106M [GeForce RTX 3060 Mobile / Max-Q]
2523  GA106M [GeForce RTX 3050 Ti Mobile / Max-Q]
252f  GA106 [GeForce RTX 3060 Engineering Sample]
2531  GA106 [RTX A2000]
2560  GA106M [GeForce RTX 3060 Mobile / Max-Q]
2563  GA106M [GeForce RTX 3050 Ti Mobile / Max-Q]
2571  GA106 [RTX A2000 12GB]
2583  GA107 [GeForce RTX 3050]
25a0  GA107M [GeForce RTX 3050 Ti Mobile]
25a2  GA107M [GeForce RTX 3050 Mobile]
25a3  GA107
25a4  GA107
25a5  GA107M [GeForce RTX 3050 Mobile]COPY
[Geforce RTX 3050]替换为[GeForce RTX 3050 4G]
[GeForce RTX 3050 Ti Mobile]替换为[GeForce RTX 3050 Ti Mobile 4G]
...
同理
[GeForce RTX 3060]替换为[GeForce RTX 3060 6G]
[GeForce RTX 3060 Lite Hash Rate] 替换为[GeForce RTX 3060 Lite Hash Rate 6G]
...
还有
3070
3080
很多条

最好备注下 因为看不懂

抛砖引玉
param([strinG]$file); #修改前的文件
$file1 = [io.fileinfo]$file;
$file2 = ".\1.txt"
$UTF8NoBom = New-Object System.Text.UTF8Encoding $false;
$str = [IO.File]::ReadAllText($file, [Text.Encoding]::Default);
$str = $str -replace'3050]','3050 4G]'-replace'3060]','3060 6G]'-replace '\r\n', "`n";
[IO.File]::WriteAllText($file2, $str, $UTF8NoBom);COPY
师从Jet Chan、mdyblog、WHY、Batcher,追求实用与效率。以解决问题为本,专注实践,保持学习,持续精进。

本帖最后由 WHY 于 2022-10-15 22:41 编辑
param([string]$file); #修改前的文件
$file2 = ".\1.txt"; #修改后的文件
$Hash1 = @{ '5' = '4G'; '6' = '6G'; '7' = '8G'; '8' = '8G' }
$Hash2 = @{ '5' = '4G'; '6' = '6G'; '7' = '8G'; '8' = '16G'; '9' = '24G' }
$Block1 = {
    param($m);
    $m0 = $m.Groups[0].Value;
    $m1 = $m.Groups[1].Value;
    if( $m0 -match '\d+GB?' ){
        return $m0 -replace '(\d+G)B', '$1';
    } else {
        return $m0 + ' ' + $Hash1[$m1];
    }
}
$Block2 = {
    param($m);
    $m0 = $m.Groups[0].Value;
    $m1 = $m.Groups[1].Value;
    if( $m0 -match '\d+GB?' ){
        return $m0 -replace '(\d+G)B', '$1';
    } else {
        return $m0 + ' ' + $Hash2[$m1];
    }
}
$UTF8NoBom = New-Object System.Text.UTF8Encoding $false;
$str = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
$str = [regex]::Replace( $str, '\b[12]0([5-8])0[^[\]]*(?=])', $Block1 );
$str = [regex]::Replace( $str, '\b[34]0([5-9])0[^[\]]*(?=])', $Block2 );
#$str = $str -replace '\r\n', "`n";
[IO.File]::WriteAllText($file2, $str, $UTF8NoBom);
echo 'Done';
[Console]::ReadLine();COPY

TOP

本帖最后由 smss 于 2022-10-15 21:26 编辑

回复 2# WHY

老师

如果文本中含有GB就只把GB替换为G 而不添加G怎样改
这是要修改的文本->https://share.weiyun.com/AXZ1xaz5

249c  GA104M [GeForce RTX 3080 Mobile / Max-Q 8GB/16GB]修改为249c  GA104M [GeForce RTX 3080 Mobile / Max-Q 8G/16G]
我这照葫芦画瓢 知其然不知所以然的怕是要丢人了
param([string]$file); #修改前的文件
$file2 = ".\1.txt"; #修改后的文件
$Hash1 = @{ '5' = '4G'; '6' = '6G'; '7' = '8G'; '8' = '8G'}   
$Hash2 = @{ '5' = '4G'; '6' = '6G'; '7' = '8G'; '8' = '16G'; '9' = '24G' }   #3050=4G 3060=6G 3070=8G 3080=10G
$UTF8NoBom = New-Object System.Text.UTF8Encoding $false;
$str = [IO.File]::ReadAllText($file, [Text.Encoding]::Default);
$str = [regex]::Replace( $str, '\b10([5-8])0[^\]]*(?=])', { param($m); $m.Groups[0].Value + ' ' + $Hash1[$m.Groups[1].Value] } );
$str = [regex]::Replace( $str, '\b20([5-8])0[^\]]*(?=])', { param($m); $m.Groups[0].Value + ' ' + $Hash1[$m.Groups[1].Value] } );
$str = [regex]::Replace( $str, '\b30([5-9])0[^\]]*(?=])', { param($m); $m.Groups[0].Value + ' ' + $Hash2[$m.Groups[1].Value] } );
$str = [regex]::Replace( $str, '\b40([5-9])0[^\]]*(?=])', { param($m); $m.Groups[0].Value + ' ' + $Hash2[$m.Groups[1].Value] } );
$str = $str -replace '\r\n', "`n";
[IO.File]::WriteAllText($file2, $str, $UTF8NoBom);
echo 'Done';
[Console]::ReadLine();COPY
148c 2357  Grenada XT [Radeon R9 390X] 也会被替换为148c 2357  Grenada XT [Radeon R9 390X 8G]

TOP

回复 3# smss


    已修改

TOP

回复 4# WHY WHY老师 总是能求同存异让代码很精减 膜拜老师

TOP

本帖最后由 smss 于 2023-3-5 18:38 编辑

回复 2# WHY
40系列发布了细看下错了不少 望修正 拜托 此处下载https://pci-ids.ucw.cz/笔电有Laptop GPU
例子:
2684  AD102 [GeForce RTX 4090]                        替换为 2684  AD102 [GeForce RTX 4090 24G]
2717  GN21-X11 [GeForce RTX 4090 Laptop GPU]           2717  GN21-X11 [GeForce RTX 4090 Laptop GPU 16G]
桌面和笔电显存容量并不相同祥见下表 空白表示没有
RTX 10系列 桌面显存 笔电显存
GTX 1080 Ti 8GB 8GB
GTX 1080 8GB 8GB
GTX 1070 8GB 8GB
GTX 1060 6GB 6GB
GTX 1050 Ti 4GB 4GB
GTX 1050 2GB 2GB
RTX 16系列
GTX 1660 Ti 6GB 6GB
GTX 1660 Super 6GB
GTX 1660 6GB
GTX 1650 Super 4GB
GTX 1650 (G5) 4GB
GTX 1650 (G6) 4GB
GTX 1630 4GB
GTX 1650 Ti 4GB 4GB
GTX 1650 4GB 4GB
RTX 20系列
RTX 2080 Ti 11 GB
RTX 2080 SUPER 8 GB 8 GB
RTX 2080 8 GB 8 GB
RTX 2070 SUPER 8 GB 8 GB
RTX 2070 8 GB 8 GB
RTX 2060 SUPER 8 GB 8 GB
RTX 2060 6 GB 6 GB
RTX 2050 4 GB 4 GB
RTX 30系列
RTX 3090 Ti 24 GB
RTX 3090 24 GB
RTX 3080 Ti 12 GB 16 GB
RTX 3080 12 GB / 10 GB 8 GB / 16 GB
RTX 3070 Ti 8 GB 8 GB
RTX 3070 8 GB 8 GB
RTX 3060 Ti 8 GB
RTX 3060 12 GB 6 GB
RTX 3050 Ti 6 GB 4 GB
RTX 3050 8 GB 4 GB
RTX 40系列
RTX 4090 24 GB 16 GB
RTX 4080 16 GB 12 GB
RTX 4070 Ti 12 GB
RTX 4070 12 GB 8 GB
RTX 4060 Ti 8GB
RTX 4060 8 GB? 8 GB
RTX 4050 6 GB? 6 GBCOPY

TOP

回复 6# smss
$Block2 = {
    param($m);
    $m0 = $m.Groups[0].Value;
    $m1 = $m.Groups[1].Value;
    If( $m0 -match '\d+GB?'){
        return $m0 -replace '(\d+G)B', '$1';
    } elseIf ($m0 -match '\b4090 Laptop GPU'){
        return $m0 + ' 16G';
    } else {
        return $m0 + ' ' + $Hash2[$m1];
    }
}COPY
1

评分人数

    • smss: 还有其它不同,明天有空再弄技术 + 1

TOP

本帖最后由 newswan 于 2023-3-4 21:44 编辑

建议
$hash = @{
    '3050' = ' 4G'
    '3060' = ' 6G'
    '3070' = ' 8G'
}
$block = {
    param($m)
    $m0 = $m.Groups[0].Value
    $m1 = $m.Groups[1].Value
    return $m0 + $hash[$m1]
}
$str = [regex]::Replace( $str, 'RTX (\d+) [^]]+', $Block );COPY
1

评分人数

    • smss: 之前确实不妥技术 + 1

TOP

本帖最后由 WHY 于 2023-3-6 08:48 编辑

回复 6# smss
这样试下
修改正则模式;增加 1070 Ti,我测试没有问题
$file1 = 'pci.ids';        #修改前的文件
$file2 = '1.txt';          #修改后的文件
#桌面系列
$Hash1  = @{
    '1050' = '2G';        #10
    '1050 Ti' = '4G';
    '1060' = '6G';
    '1070' = '8G';
    '1070 Ti' = '8G';
    '1080' = '8G';
    '1080 Ti' = '8G';
    '1650' = '4G';        #16
    '1630' = '4G';
    '1660' = '6G';
    '2050' = '4G';        #20
    '2060' = '6G';
    '2060 SUPER' = '8G';
    '2070' = '8G';
    '2070 SUPER' = '8G';
    '2080' = '8G';
    '2080 SUPER' = '8G';
    '2080 Ti' = '11G';
    '3050' = '8G';        #30
    '3050 Ti' = '6G';
    '3060' = '12G';
    '3060 Ti' = '8G';
    '3070' = '8G';
    '3070 Ti' = '8G';
    '3080' = '12G / 10G';
    '3080 Ti' = '12G';
    '3090' = '24G';
    '3090 Ti' = '24G';
    '4050' = '6G';        #40
    '4060' = '8G';
    '4060 Ti' = '8G';
    '4070' = '12G';
    '4070 Ti' = '12G';
    '4080' = '16G';
    '4090' = '24G'
}
#移动系列
$Hash2  = @{
    '1050' = '2G';        #10
    '1050 Ti' = '4G';
    '1060' = '6G';
    '1070' = '8G';
    '1070 Ti' = '8G';
    '1080' = '8G';
    '1080 Ti' = '8G';
    '1650' = '4G';        #16
    '1660' = '6G';
    '2050' = '4G';        #20
    '2060' = '6G';
    '2060 SUPER' = '8G';
    '2070' = '8G';
    '2070 SUPER' = '8G';
    '2080' = '8G';
    '2080 SUPER' = '8G';
    '3050' = '4G';        #30
    '3050 Ti' = '4G';
    '3060' = '6G';
    '3070' = '8G';
    '3070 Ti' = '8G';
    '3080' = '8G / 16G';
    '3080 Ti' = '16G';
    '4050' = '6G';        #40
    '4060' = '8G';
    '4070' = '8G';
    '4080' = '12G';
    '4090' = '16G'
}
$Block = {
    param($m);
    $m0 = $m.Groups[0].Value;
    $m1 = $m.Groups[1].Value;
    if( $m0 -match '\b[0-9]+GB?' ){
        return $m0 -replace '\b([0-9]+G)B', '$1';
    } elseIf( $m0 -match '(?-i:Mobile|Laptop)' ){
        return $m0 + ' ' + $Hash2[$m1];
    } else {
        return $m0 + ' ' + $Hash1[$m1];
    }
}
$UTF8NoBom = New-Object System.Text.UTF8Encoding $false;
$str = [IO.File]::ReadAllText($file1, [Text.Encoding]::UTF8);
$str = [regex]::Replace( $str, '(?<=[GR]TX )([1-4]0[5-9]0(?: Ti| SUPER)?|16[356]0)\b[^[\]]*(?=])', $Block );
$str = $str -replace '(?<!\r)\n', "`r`n";
[IO.File]::WriteAllText($file2, $str, $UTF8NoBom);COPY

TOP

返回列表