我有一个像这样的文件。 这种格式有很多行。
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-Content
和Foreach-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)