找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 18587|回复: 8

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

[复制链接]
发表于 2022-10-15 00:15:57 | 显示全部楼层 |阅读模式
本帖最后由 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);
复制代码
发表于 2022-10-15 14:21:29 | 显示全部楼层
本帖最后由 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();
复制代码
 楼主| 发表于 2022-10-15 20:17:50 | 显示全部楼层
本帖最后由 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]
发表于 2022-10-15 22:41:32 | 显示全部楼层
回复 3# smss


    已修改
 楼主| 发表于 2022-10-16 08:51:33 | 显示全部楼层
回复 4# WHY WHY老师 总是能求同存异让代码很精减 膜拜老师
 楼主| 发表于 2023-3-4 15:02:36 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2023-3-4 18:22:24 | 显示全部楼层
回复 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. }
复制代码

评分

参与人数 1技术 +1 收起 理由
smss + 1 还有其它不同,明天有空再弄

查看全部评分

发表于 2023-3-4 21:41:48 | 显示全部楼层
本帖最后由 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 );
复制代码

评分

参与人数 1技术 +1 收起 理由
smss + 1 之前确实不妥

查看全部评分

发表于 2023-3-6 01:42:45 | 显示全部楼层
本帖最后由 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);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 01:12 , Processed in 0.023552 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表