如何使用Powershell替换大括号内的文本?

时间:2013-10-03 02:05:09

标签: regex powershell

我在C#类上运行以下powershell脚本,以便用空构造函数替换构造函数。我在自动生成的许多文件中执行此操作。

$nl = [Environment]::NewLine
foreach($item in Get-ChildItem $path) {            
        if($item.extension -eq ".cs") {

            $name = $item.name
            $name = $name.replace('.cs', '')
            $reg = '(public ' + $name + '\(.*?\})'
            $constructorString = [regex]$reg
            $emptyConstructor = 'public ' + $name + '()' + $nl + '{' + $nl + '}' + $nl


            Get-Content $item.fullname -Raw | Where-Object { $_ -match $constructorString } | ForEach-Object { $_ -replace $constructorString, '$1'}            
        }
}

这些课程有

的形式
public Bar()
{
    this.foo = new Foo();
}

这导致没有匹配,如果需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

无需将模式转换为正则表达式。试试这个:

$item | Get-Content -raw | Where {$_ -match "(?s)(public\s+${name}\s*\(.*?\})"} | ...

我相信您遇到的问题是,虽然您使用-Raw参数将C#文件作为单个字符串读取,但字符串中有换行符.*不会除非在正则表达式中使用单行模式,否则遍历。这就是(?s)的作用。

此外,如果您使用的是PowerShell V3,则可以使用basename而不是替换例如:

$name = $item.basename

BTW你有没有看过Roslyn作为正则表达式搜索/替换方法的替代方法? Roslyn将为您为每个源文件构建一个AST。有了它,您可以轻松找到默认构造函数并将其替换为空构造函数。