Board logo

标题: [问题求助] PowerShell处理一对儿相匹配的行内的字符 [打印本页]

作者: 5i365    时间: 2022-10-19 15:40     标题: PowerShell处理一对儿相匹配的行内的字符

本帖最后由 5i365 于 2022-10-20 07:41 编辑

xxx 表示函数名, 它的正则是 ^[a-zA-Z_][a-zA-Z0-9_]*$

先获取所有的 function xxx(

再把每个 function xxx( 去匹配 $xxx( 开头的行(该行前可能有tab或空格)

如果能匹配到: 则先将该行开头的 $ 还有后面的 ,) 替换为空(即:删掉它们), 再将 ( 替换为一个空格

例如 function A( 能匹配到 $A( 开头的行, 则将该行由原来的 $A($p1, $p2) 改为 A $p1 $p2

___________________________________________处理前:

$A($p1, $p2)
$BB($p1)
$CCC()

function A($p1, $p2)
function BB($p1)
function CCC()

___________________________________________处理后:

A $p1 $p2
BB $p1
CCC

function A($p1, $p2)
function BB($p1)
function CCC()

___________________________________________代码:
  1. $s = @'
  2. $A($p1, $p2)
  3.         $BB($p1)
  4. $CCC()
  5. function A($p1, $p2)
  6. function BB($p1)
  7. function CCC()
  8. '@
  9. # 表示 xxx 的正则是 ^[a-zA-Z_][a-zA-Z0-9_]*$
  10. # 先获取所有的 function xxx(
  11. # 再把每个 function xxx( 去匹配 $xxx( 开头的行(该行前可能有tab或空格,要保留)
  12. # 如果能匹配到: 则先将该行开头的 $ 还有后面的 , 和 ) 替换为空(即:删掉它们), 再将 ( 替换为一个空格
  13. # 例如 function A( 能匹配到 $A( 则将该行按上面规则改为 A $p1 $p2
  14. # 最终输出效果如下:
  15. <#
  16. A $p1 $p2
  17.         BB $p1
  18. CCC
  19. function A($p1, $p2)
  20. function BB($p1)
  21. function CCC()
  22. #>
复制代码

作者: 5i365    时间: 2022-10-23 12:27

本帖最后由 5i365 于 2022-10-23 13:04 编辑

搞的差不多了,  但是结果重叠了
  1. $s = @'
  2. $A($p1, $p2)
  3.         $BB($p1)
  4. $CCC()
  5. function A($p1, $p2)
  6. function BB($p1)
  7. function CCC()
  8. '@
  9. $a = @()
  10. $s -split '\r?\n' |
  11. foreach {
  12.         if ($_ -match 'function ([a-zA-Z_][a-zA-Z0-9_]*\(.*\))')
  13.         {
  14.                 $a += $matches[1]
  15.         }
  16. }
  17. $a |
  18. foreach{
  19.         $r = '${0}' -f $_
  20.         $n = $r -replace '\(', ' ' -replace '\)' -replace ',' -replace '^\$'
  21.         
  22.         $s.Replace($r, $n)
  23. }
复制代码

作者: 5i365    时间: 2022-10-23 13:10

搞定
  1. $s = @'
  2. $A($p1, $p2)
  3. $BB($p1)
  4. $CCC()
  5. function A($p1, $p2)
  6. function BB($p1)
  7. function CCC()
  8. '@
  9. @()
  10. $s -split '\r?\n' |
  11. foreach {
  12. if ($_ -match 'function ([a-zA-Z_][a-zA-Z0-9_]*\(.*\))')
  13. {
  14. $matches[1]
  15. }
  16. } |
  17. foreach{
  18. $r = '${0}' -f $_
  19. $n = $r -replace '\(', ' ' -replace '\)' -replace ',' -replace '^\$'
  20. $s = $s.Replace($r, $n)
  21. }
  22. $s
复制代码





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