在PowerShell中替换字符串中第一个匹配的字符

3
在下面的字符串中,
apache:x:48:48:Apache:/var/www:/sbin/nologin

我该如何将第一个冒号(仅限第一个)替换为逗号,以便得到以下字符串?

apache,x:48:48:Apache:/var/www:/sbin/nologin

此外,代码必须支持具有多行的文件,并仅替换每行中的第一个逗号。
1个回答

8
使用正则表达式:
PS C:\> $s = 'apache:x:48:48:Apache:/var/www:/sbin/nologin'
PS C:\> $s -replace '^(.*?):(.*)','$1,$2'
apache,x:48:48:Apache:/var/www:/sbin/nologin

正则表达式解析:

  • ^(.*?):: 匹配字符串开头和冒号之间的最短匹配(即第一个冒号前的文本)。
  • (.*): 匹配字符串中第一个冒号后的所有内容。

括号将子表达式分组,以便在替换字符串中引用它们,如$1$2

进一步解释:

  • ^ 匹配字符串的开头。
  • .* 匹配任意数量的字符 (. ⇒ 任意字符, * ⇒ 零个或多个)。
  • .*? 同样匹配任意数量的字符,但是会给出最短的匹配 (?),而不是最长的匹配。这被称为“非贪婪匹配”。

谢谢你的回答! :) 你介意解释一下正则表达式中这些字符的作用吗?谢谢! - Bluz
太棒了!谢谢先生! :) - Bluz

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