PowerShell提取debit行并移除文件路径与行号的问题求助
解决方案
问题出在你用的是.Replace()方法——这个方法只支持字面字符串替换,不识别*作为通配符,所以你写的'C:\temp\TRANSFile1.txt:*:'会被当成完整的字面内容去匹配,自然找不到对应内容替换。
下面给你几种可行的解决办法:
方法1:使用正则表达式替换(推荐)
PowerShell的-replace操作符支持正则表达式,能精准匹配开头的路径+行号部分:
Get-Content "C:\temp\sourcetrans.txt" | Where-Object { $_ -match 'debit' } | ForEach-Object { $_ -replace '^C:\\temp\\TRANSFile1.txt:\d+:', '' } | Out-File -FilePath C:\temp\SSFinal.txt
- 正则说明:
^匹配行首,\d+匹配一个或多个数字(行号),整个正则会匹配每行开头的C:\temp\TRANSFile1.txt:XXX:格式内容,替换为空就得到你要的结果。
方法2:按冒号分割字符串
每行的结构是路径:行号:内容,可以用Split()分割后取从第三个元素开始的部分:
Get-Content "C:\temp\sourcetrans.txt" | Where-Object { $_ -like '*debit*' } | ForEach-Object { ($_ -split ':', 3)[2] } | Out-File -FilePath C:\temp\SSFinal.txt
-split ':', 3表示按冒号分割成最多3部分,[2]取分割后的第三部分(索引从0开始),也就是去掉前两个冒号分隔的内容后的剩余部分。
方法3:通用匹配(路径/行号不固定时用)
如果源文件里的路径或行号不固定,也可以用通用正则匹配开头的两段非冒号内容:
Get-Content "C:\temp\sourcetrans.txt" | ForEach-Object { if ($_ -match 'debit') { $_ -replace '^[^:]+:[^:]+:', '' } } | Where-Object { $_ } | Out-File -FilePath C:\temp\SSFinal.txt
- 正则
^[^:]+:[^:]+:的意思是:匹配行首连续两个非冒号的段(路径和行号),不管具体内容是什么,直接替换为空。
注意:如果不需要追加内容,去掉-append参数,避免每次运行重复写入旧内容。
内容的提问来源于stack exchange,提问作者sunpills
相关产品推荐
相关产品推荐

