Board logo

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

作者: smss    时间: 2022-10-15 00:15     标题: [已解决]请教PowerShell怎样匹配替换有特定规律的文本

本帖最后由 smss 于 2022-10-15 23:24 编辑
  1. 2501  GA106 [GeForce RTX 3060]
  2. 2503  GA106 [GeForce RTX 3060]
  3. 2504  GA106 [GeForce RTX 3060 Lite Hash Rate]
  4. 2505  GA106
  5. 2507  GA106 [Geforce RTX 3050]
  6. 2508  GA106 [GeForce RTX 3050 OEM]
  7. 2520  GA106M [GeForce RTX 3060 Mobile / Max-Q]
  8. 2523  GA106M [GeForce RTX 3050 Ti Mobile / Max-Q]
  9. 252f  GA106 [GeForce RTX 3060 Engineering Sample]
  10. 2531  GA106 [RTX A2000]
  11. 2560  GA106M [GeForce RTX 3060 Mobile / Max-Q]
  12. 2563  GA106M [GeForce RTX 3050 Ti Mobile / Max-Q]
  13. 2571  GA106 [RTX A2000 12GB]
  14. 2583  GA107 [GeForce RTX 3050]
  15. 25a0  GA107M [GeForce RTX 3050 Ti Mobile]
  16. 25a2  GA107M [GeForce RTX 3050 Mobile]
  17. 25a3  GA107
  18. 25a4  GA107
  19. 25a5  GA107M [GeForce RTX 3050 Mobile]
复制代码
[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
很多条

最好备注下 因为看不懂

抛砖引玉
  1. param([strinG]$file); #修改前的文件
  2. $file1 = [io.fileinfo]$file;
  3. $file2 = ".\1.txt"
  4. $UTF8NoBom = New-Object System.Text.UTF8Encoding $false;
  5. $str = [IO.File]::ReadAllText($file, [Text.Encoding]::Default);
  6. $str = $str -replace'3050]','3050 4G]'-replace'3060]','3060 6G]'-replace '\r\n', "`n";
  7. [IO.File]::WriteAllText($file2, $str, $UTF8NoBom);
复制代码

作者: WHY    时间: 2022-10-15 14:21

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

作者: smss    时间: 2022-10-15 20:17

本帖最后由 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]
我这照葫芦画瓢 知其然不知所以然的怕是要丢人了
  1. param([string]$file); #修改前的文件
  2. $file2 = ".\1.txt"; #修改后的文件
  3. $Hash1 = @{ '5' = '4G'; '6' = '6G'; '7' = '8G'; '8' = '8G'}   
  4. $Hash2 = @{ '5' = '4G'; '6' = '6G'; '7' = '8G'; '8' = '16G'; '9' = '24G' }   #3050=4G 3060=6G 3070=8G 3080=10G
  5. $UTF8NoBom = New-Object System.Text.UTF8Encoding $false;
  6. $str = [IO.File]::ReadAllText($file, [Text.Encoding]::Default);
  7. $str = [regex]::Replace( $str, '\b10([5-8])0[^\]]*(?=])', { param($m); $m.Groups[0].Value + ' ' + $Hash1[$m.Groups[1].Value] } );
  8. $str = [regex]::Replace( $str, '\b20([5-8])0[^\]]*(?=])', { param($m); $m.Groups[0].Value + ' ' + $Hash1[$m.Groups[1].Value] } );
  9. $str = [regex]::Replace( $str, '\b30([5-9])0[^\]]*(?=])', { param($m); $m.Groups[0].Value + ' ' + $Hash2[$m.Groups[1].Value] } );
  10. $str = [regex]::Replace( $str, '\b40([5-9])0[^\]]*(?=])', { param($m); $m.Groups[0].Value + ' ' + $Hash2[$m.Groups[1].Value] } );
  11. $str = $str -replace '\r\n', "`n";
  12. [IO.File]::WriteAllText($file2, $str, $UTF8NoBom);
  13. echo 'Done';
  14. [Console]::ReadLine();
复制代码
148c 2357  Grenada XT [Radeon R9 390X] 也会被替换为148c 2357  Grenada XT [Radeon R9 390X 8G]
作者: WHY    时间: 2022-10-15 22:41

回复 3# smss


    已修改
作者: smss    时间: 2022-10-16 08:51

回复 4# WHY WHY老师 总是能求同存异让代码很精减 膜拜老师
作者: smss    时间: 2023-3-4 15:02

本帖最后由 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]
桌面和笔电显存容量并不相同祥见下表 空白表示没有
  1. RTX 10系列 桌面显存 笔电显存
  2. GTX 1080 Ti 8GB 8GB
  3. GTX 1080 8GB 8GB
  4. GTX 1070 8GB 8GB
  5. GTX 1060 6GB 6GB
  6. GTX 1050 Ti 4GB 4GB
  7. GTX 1050 2GB 2GB
  8. RTX 16系列
  9. GTX 1660 Ti 6GB 6GB
  10. GTX 1660 Super 6GB
  11. GTX 1660 6GB
  12. GTX 1650 Super 4GB
  13. GTX 1650 (G5) 4GB
  14. GTX 1650 (G6) 4GB
  15. GTX 1630 4GB
  16. GTX 1650 Ti 4GB 4GB
  17. GTX 1650 4GB 4GB
  18. RTX 20系列
  19. RTX 2080 Ti 11 GB
  20. RTX 2080 SUPER 8 GB 8 GB
  21. RTX 2080 8 GB 8 GB
  22. RTX 2070 SUPER 8 GB 8 GB
  23. RTX 2070 8 GB 8 GB
  24. RTX 2060 SUPER 8 GB 8 GB
  25. RTX 2060 6 GB 6 GB
  26. RTX 2050 4 GB 4 GB
  27. RTX 30系列
  28. RTX 3090 Ti 24 GB
  29. RTX 3090 24 GB
  30. RTX 3080 Ti 12 GB 16 GB
  31. RTX 3080 12 GB / 10 GB 8 GB / 16 GB
  32. RTX 3070 Ti 8 GB 8 GB
  33. RTX 3070 8 GB 8 GB
  34. RTX 3060 Ti 8 GB
  35. RTX 3060 12 GB 6 GB
  36. RTX 3050 Ti 6 GB 4 GB
  37. RTX 3050 8 GB 4 GB
  38. RTX 40系列
  39. RTX 4090 24 GB 16 GB
  40. RTX 4080 16 GB 12 GB
  41. RTX 4070 Ti 12 GB
  42. RTX 4070 12 GB 8 GB
  43. RTX 4060 Ti 8GB
  44. RTX 4060 8 GB? 8 GB
  45. RTX 4050 6 GB? 6 GB
复制代码

作者: WHY    时间: 2023-3-4 18:22

回复 6# smss
  1. $Block2 = {
  2.     param($m);
  3.     $m0 = $m.Groups[0].Value;
  4.     $m1 = $m.Groups[1].Value;
  5.     If( $m0 -match '\d+GB?'){
  6.         return $m0 -replace '(\d+G)B', '$1';
  7.     } elseIf ($m0 -match '\b4090 Laptop GPU'){
  8.         return $m0 + ' 16G';
  9.     } else {
  10.         return $m0 + ' ' + $Hash2[$m1];
  11.     }
  12. }
复制代码

作者: newswan    时间: 2023-3-4 21:41

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

建议
  1. $hash = @{
  2.     '3050' = ' 4G'
  3.     '3060' = ' 6G'
  4.     '3070' = ' 8G'
  5. }
  6. $block = {
  7.     param($m)
  8.     $m0 = $m.Groups[0].Value
  9.     $m1 = $m.Groups[1].Value
  10.     return $m0 + $hash[$m1]
  11. }
  12. $str = [regex]::Replace( $str, 'RTX (\d+) [^]]+', $Block );
复制代码

作者: WHY    时间: 2023-3-6 01:42

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

回复 6# smss
这样试下
修改正则模式;增加 1070 Ti,我测试没有问题
  1. $file1 = 'pci.ids';        #修改前的文件
  2. $file2 = '1.txt';          #修改后的文件
  3. #桌面系列
  4. $Hash1  = @{
  5.     '1050' = '2G';        #10
  6.     '1050 Ti' = '4G';
  7.     '1060' = '6G';
  8.     '1070' = '8G';
  9.     '1070 Ti' = '8G';
  10.     '1080' = '8G';
  11.     '1080 Ti' = '8G';
  12.     '1650' = '4G';        #16
  13.     '1630' = '4G';
  14.     '1660' = '6G';
  15.     '2050' = '4G';        #20
  16.     '2060' = '6G';
  17.     '2060 SUPER' = '8G';
  18.     '2070' = '8G';
  19.     '2070 SUPER' = '8G';
  20.     '2080' = '8G';
  21.     '2080 SUPER' = '8G';
  22.     '2080 Ti' = '11G';
  23.     '3050' = '8G';        #30
  24.     '3050 Ti' = '6G';
  25.     '3060' = '12G';
  26.     '3060 Ti' = '8G';
  27.     '3070' = '8G';
  28.     '3070 Ti' = '8G';
  29.     '3080' = '12G / 10G';
  30.     '3080 Ti' = '12G';
  31.     '3090' = '24G';
  32.     '3090 Ti' = '24G';
  33.     '4050' = '6G';        #40
  34.     '4060' = '8G';
  35.     '4060 Ti' = '8G';
  36.     '4070' = '12G';
  37.     '4070 Ti' = '12G';
  38.     '4080' = '16G';
  39.     '4090' = '24G'
  40. }
  41. #移动系列
  42. $Hash2  = @{
  43.     '1050' = '2G';        #10
  44.     '1050 Ti' = '4G';
  45.     '1060' = '6G';
  46.     '1070' = '8G';
  47.     '1070 Ti' = '8G';
  48.     '1080' = '8G';
  49.     '1080 Ti' = '8G';
  50.     '1650' = '4G';        #16
  51.     '1660' = '6G';
  52.     '2050' = '4G';        #20
  53.     '2060' = '6G';
  54.     '2060 SUPER' = '8G';
  55.     '2070' = '8G';
  56.     '2070 SUPER' = '8G';
  57.     '2080' = '8G';
  58.     '2080 SUPER' = '8G';
  59.     '3050' = '4G';        #30
  60.     '3050 Ti' = '4G';
  61.     '3060' = '6G';
  62.     '3070' = '8G';
  63.     '3070 Ti' = '8G';
  64.     '3080' = '8G / 16G';
  65.     '3080 Ti' = '16G';
  66.     '4050' = '6G';        #40
  67.     '4060' = '8G';
  68.     '4070' = '8G';
  69.     '4080' = '12G';
  70.     '4090' = '16G'
  71. }
  72. $Block = {
  73.     param($m);
  74.     $m0 = $m.Groups[0].Value;
  75.     $m1 = $m.Groups[1].Value;
  76.     if( $m0 -match '\b[0-9]+GB?' ){
  77.         return $m0 -replace '\b([0-9]+G)B', '$1';
  78.     } elseIf( $m0 -match '(?-i:Mobile|Laptop)' ){
  79.         return $m0 + ' ' + $Hash2[$m1];
  80.     } else {
  81.         return $m0 + ' ' + $Hash1[$m1];
  82.     }
  83. }
  84. $UTF8NoBom = New-Object System.Text.UTF8Encoding $false;
  85. $str = [IO.File]::ReadAllText($file1, [Text.Encoding]::UTF8);
  86. $str = [regex]::Replace( $str, '(?<=[GR]TX )([1-4]0[5-9]0(?: Ti| SUPER)?|16[356]0)\b[^[\]]*(?=])', $Block );
  87. $str = $str -replace '(?<!\r)\n', "`r`n";
  88. [IO.File]::WriteAllText($file2, $str, $UTF8NoBom);
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2