PowerShell替换含特殊字符文本行及括号精准处理问题
问题与解决方案
主问题:第三条替换命令失效的原因
你的第三条命令失效核心有两个关键问题:
- 匹配字符串里的
(、$都是正则特殊字符:(用于分组,$是行尾锚点,必须转义才能当作字面字符匹配(要么手动加\,要么用[regex]::Escape()统一处理整个匹配文本) - 替换字符串里的
$0是PowerShell正则替换的特殊变量,代表整个匹配的内容,而非字面的$0;要表示字面的美元符号$,必须写成$$
修正后的命令
推荐用[regex]::Escape()统一处理带特殊字符的匹配文本,同时转义替换字符串里的$:
ls *.txt -rec | %{$f=$_; (gc $f.PSPath) | %{$_ -replace [regex]::Escape(": Hold'em No Limit ($0.50/$1.00 USD)"), " - Holdem(No Limit) - $$0.50/$$1.00"} | sc $f.PSPath}
也可以手动转义匹配文本里的特殊字符,同时转义替换字符串的$:
ls *.txt -rec | %{$f=$_; (gc $f.PSPath) | %{$_ -replace ": Hold'em No Limit \(\$0\.50/\$1\.00 USD\)", " - Holdem(No Limit) - $$0.50/$$1.00"} | sc $f.PSPath}
附加问题:移除特定位置的括号(保留金额内容)
可以用正则捕获组精准匹配won (开头、)结尾的金额部分,直接提取括号内的内容完成替换,无需固定数字:
实现命令
ls *.txt -rec | %{$f=$_; (gc $f.PSPath) | %{$_ -replace "won \((\$[\d.]+\))", "won `$1"} | sc $f.PSPath}
正则说明
won \(:匹配字面的won (((转义为\(避免被当成正则分组)(\$[\d.]+):捕获组,匹配$开头、后续是数字和小数点的任意金额内容- 替换字符串里的
$1代表捕获组捕获到的金额,这样就能去掉目标括号,同时保留金额本身
内容的提问来源于stack exchange,提问作者raramuri
相关产品推荐
相关产品推荐

