在 Powershell 中替换匹配的字符

Replacing a Matched Character in Powershell

我有一个包含 3 个名称条目的文本文件:

# dot_test.txt
001 AALTON, Alan .....25 Every Street
006 JOHNS, Jason .... 3 Steep Street
002 BROWN. James .... 101 Browns Road

我的任务是查找 NAME 的实例。当它应该是 NAME 时,使用以下内容:

Select-String -AllMatches -Path $input_path -Pattern '(?s)[A-Z]{3}.*?\D(?=\s|$)' -CaseSensitive |
    ForEach-Object { if($_.Matches.Value -match '\.$'){$_.Matches.Value -replace '\,$'} }

输出为:

BROWN.

结论是这个脚本块标识了 NAME 的实例。但是没能更换。

如有任何关于如何实现这一点的建议,我们将不胜感激。

可以直接使用-replace,如果需要同时替换字符串末尾的逗号和点,使用[.,]$ regex:

Select-String -AllMatches -Path $input_path -Pattern '(?s)[A-Z]{3}.*?\D(?=\s|$)' -CaseSensitive | % {$_.Matches.Value -replace '\.$', ','}

详情:

  • (?s)[A-Z]{3}.*?\D(?=\s|$) - 匹配
    • (?s) - RegexOptions.Singleline 模式打开并且 . 可以匹配换行符
    • [A-Z]{3} - 三个大写 ASCII 字母
    • .*? - 尽可能少的任何零个或多个字符
    • \D - 任何 non-digit 字符
    • (?=\s|$) - 匹配紧跟空格或字符串末尾的位置的正前瞻。

\.$ 模式匹配字符串末尾的 .

$_.Matches.Value -replace '\,$'

这会尝试在 ($) 的末尾替换 ,(您无需将其转义为 \,)为空 string(由于缺少第二个 replacement 操作数),即它会有效地 remove 尾随 ,.

但是,鉴于您的匹配项不包含 ,,并且您希望将其尾随 . 替换为 ,,请使用以下内容:

$_.Matches.Value -replace '\.$', ','  # -> 'BROWN,'