如何在PowerShell中使用正则表达式处理文件中的每一行

3

在一个文件中,我有这样一行:

I     have lot         of spaces in      me.

我使用以下PowerShell代码将每个空格替换为一个空格:

$String = "I     have lot         of spaces in      me."
while ($String.Contains("  "))
{
$String = $String -replace "  "," "}

结果如下:

我里面有很多空格。

我想对文本文件中的每一行都这样做。你能告诉我最好的方法吗?


第二部分:

当有多个空格时,我该如何仅替换其中的某些内容,例如用;替换?

回复如下:

;4828;toto;toto;Ticket;0112APPT

而不是:

;4828;toto toto;Ticket;0112APPT

明确一下,我只想用字符;替换两个空格。


3
将文本文件yourfile.txt中的内容读取出来,并对每一行进行替换操作,将其中连续的空格替换为单个空格。具体实现方式是使用PowerShell命令"Get-Content yourfile.txt"读取文件内容,然后使用管道符将结果传递给"% {$_ -replace '\s+', ' '}"进行处理。 - Paxz
能否保留 while 循环条件?因为在以下情况下:4828 toto toto Ticket 0112APPT 如果我想用字符 ';' 替换一个以上的空格,则响应将是:;4828;toto;toto;Ticket;0112APPT 而不是:;4828;toto toto;Ticket;0112APPT明确一点,我只想用字符 ';' 替换两个空格。此致敬礼 - Loudone
1
请直接编辑您的问题并附加翻译后的文本,不要将其作为评论返回。 - Paxz
看一下我的回答,我更新了它以适应你的第二个问题。 - Paxz
2个回答

6

就像我在评论中说的那样,这应该对你有所帮助(至少在我的测试中是这样的):

Get-Content yourfile.txt | % {$_ -replace '\s+', ' '}

说明:

Get-Content - 从给定文件中获取内容

| % - 针对从 Get-Content 获取的每一行内容

$_ -replace '\s+', ' ' - '\s+' 表示一个或多个空格


如果您想使用替换后的字符串更改文件的内容,也可以将其导入到 Set-Content 并保存到另一个文件中:

Get-Content yourfile.txt | % {$_ -replace '\s+', ' '} | Set-Content yourOutputFile.txt

如果您想在管道中写入相同的文件,请参阅:为什么不这样做!


针对您第二个问题,忽略正则表达式中的单个空格,以下是您应该采取的措施,如果要将多个空格替换为 ;

这不会替换具有单个空格的位置:

Get-Content yourfile.txt | % {$_ -replace '\s\s+', ';'}

非常感谢,Paxz,它运行得很好。我还想添加文件的重写,像这样:Get-Content yourfile.txt | % {$_ -replace '\s+', ' '} | Set-Content yourfile.txt - Loudone
@LudovicHertzog 已将其添加到答案中。 请记得接受您认为最有帮助的答案。 - Paxz
@Paxz 我认为使用 Get-Content | ... | Set-Content 写回同一个文件不是很好的做法,因为可能会导致数据丢失(现在找不到链接了)。 - Robert Dyjas
@robdy 对于这个例子,我将“内容”设置为相同的文件,但在我的脚本中,我编辑一个新的文件。 - Loudone
是的,我只是想建议对答案进行改进(未来可能会有其他人查看并盲目复制它)。 - Robert Dyjas
@robdy 是的,我现在已经改了。如果你不知何故又找到了那个链接,我很想读一下。我可以想象为什么这会是一个不好的做法,但在快速搜索中找不到具体的解释。 - Paxz

3
你可以这样做:
(Get-Content '.\TextDocument.txt' -Raw) -replace ' +', ' '

注意,在正则表达式中使用\s代替实际空格是一种选择,但它会删除不仅仅是空格,还有制表符和更关键的是行尾字符。

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