PowerShell用逗号replace前三个空格

我有一个像这样的文件。 这种格式有很多行。

5/10 RED SYSID This is a long message 

我想这些行在4个逗号分隔的列。

 5/10,RED,SYSID,This is a long message 

我怎样才能用逗号replace前三个空格?

下面的正则表达式应该做你想要的。

 $line -replace '^(\S+?) (\S+?) (\S+?) (.*)','$1,$2,$3,$4' 

这捕获了由空格分隔的四组非空白字符,最后一组包含字符串的其余部分。 然后将它们替换为由逗号分隔的相同的四个组。

要使用它来修改文件中的每个匹配行,通过Foreach-Object管道Get-Content ,最后到Out-File

 $regex = [regex]'^(\S+?) (\S+?) (\S+?) (.*)','$1,$2,$3,$4' Get-Content $filename | foreach { $_ -replace $regex } | Out-File $newfilename 

任何正则表达式不匹配的行将被发送到输出文件不变。 这包括如果任何行包含制表符而不是空格。 如果你需要在脚本中测试这个,你可以先测试$_ -match $regex ,如果返回false, $_ -match $regex采取适当的行动。

您可以使用PowerShell -split-join运算符执行此操作。

 $line -split ' ',3 -join ',' 

这个例子会把前三个空格转换成逗号。 -split ' ',3会将字符串拆分成由字符串中前三个空格分隔的四个元素的数组。 然后-join ','将它们重新加入到一个字符串之间,每个字符之间用逗号。

如果您的输入在字段之间有多个空格,则上述操作将不起作用,因为每个空格都是分开考虑的,或者您的字段由其他空格(如制表符)分隔。 相反,使用正则表达式分割。

 $line -split '\s+',3,"RegexMatch" -join ',' 

此示例将\s+的前三个匹配视为分隔符,并将一系列连续的空格转换为单个逗号。

要针对文件中的每一行运行,请使用Get-ContentForeach-Object

 Get-Content $filename | foreach { $_ -split '\s+',3,"RegexMatch" -join ',' } | Out-File $newfilename 

这可能是你在找什么。

替换文件中第一次出现的字符串

相关的代码是这样的:

 $re = [regex]' ' $re.Replace([string]::Join("`n", (gc C:\Path\To\test.txt)), ',', 3)