使用PowerShell正则表达式匹配换行符

8

我有一些数据,内容如下:

:setvar DatabaseName "CI_1814903104"
:setvar DefaultFilePrefix "CI_1814903104"
--etc.    

GO

我希望将所有以:setvar开头的sql cmd变量行替换为空字符串,使得数据看起来像这样:

--etc.    

GO

这个语句(其中$script包含数据)似乎可以解决问题,但仍然保留了换行符:
$script -replace ":setvar(.*$)", ""

导致结果如下:

 
 
--etc.    

GO

我应该如何在匹配中包含换行符?它似乎匹配了但实际上没有替换。感谢任何帮助。

1个回答

13

假设您的数据是从某个文件中读取的。根据您读取数据的方式,您可能拥有一组字符串而不是单个字符串。

PS C:\> $script = Get-Content data.txt

# Get-Content returns each line as a string object in an Object[].
PS C:\> $script.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS C:\> $script[0].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

如下所示,将Get-Content管道传递到Out-String将确保您获得单个字符串,然后您可以操作Windows换行符以删除相应的行。

PS <C:\> $script = ( Get-Content data.txt | Out-String ).Trim()
PS <C:\> $script -replace ":setvar(.*)`n", ""
--etc.

GO

谢谢阅读这些代码之间的细节——是作为数组的垃圾回收机制让我困扰了。另外,将“\r\n”替换为“\r\n”,你就可以得到分数了! - Plymouth223
@Plymouth223 在 Powershell 中的转义字符是反引号。对于使用正则表达式的情况,两种方式都可以 - 但通常不是这种情况。试试看吧。 :) - Anthony Neace
1
啊,我明白了——我的问题是我尝试了你的方法,但它没有起作用,所以我把表达式改成了“:setvar(.*)\n”,然后就可以了。文件中只包含换行符\n。谢谢。 - Plymouth223
懂了,这是我假定使用 Windows 回车符导致的错误。更有趣的是,那个表达式本来就应该捕获 \r,所以保留它也没有多大意义——我会编辑帖子去掉它。 - Anthony Neace
也许使用 Get-Content -Raw 命令而不是管道传递到 Out-String 命令也可以完成任务。请参见 Microsoft Docs - Get-Content - pavol.kutaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接