在 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,'
我有一个包含 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,'