如何在PowerShell中结合If/Else实现文本查找替换
批量修改文本行尾值的PowerShell解决方案
需求说明
- 处理含约250行的文本文件,每行以分号分隔字段
- 需按以下规则替换每行最后两个值:
- 所有以
;0;3;3;;结尾的行,替换为;0;17;18;;(已实现) - 行内包含
-的,将行尾;3;3;;替换为;21;21;; - 行内不包含
-的,将行尾;3;3;;替换为;22;22;;
- 所有以
示例文本行:
112;20-21;32;20-21;24;0;2;248;271;3;3;; 69;1;4;173390;5;0;0;5460;5464;3;3;; 24;7;4;173390;227;0;0;0;0;3;3;;
现有问题
原脚本无法区分行内是否含-,统一替换了行尾;3;3;;,尝试给含-的行加后缀的方法未成功。
原脚本代码:
foreach ($file in Get-ChildItem *.*) { (Get-Content $file) -replace ';0;3;3;;',';;0;17;18;;' -replace ';3;3;;',';21;21;;' | Out-file -encoding ASCII $file-new }
解决方案
不需要给行添加额外标记,直接逐行判断处理即可,以下是修正后的脚本:
foreach ($file in Get-ChildItem *.*) { $outputLines = Get-Content $file | ForEach-Object { $line = $_ # 处理第一个规则:替换;0;3;3;;为;0;17;18;; $line = $line -replace ';0;3;3;;', ';0;17;18;;' # 判断是否需要处理剩余规则(如果已经替换过第一个规则,行尾不再是;3;3;;) if ($line -match ';3;3;;$') { if ($line -like '*-*') { # 含-的行,替换行尾为;21;21;; $line = $line -replace ';3;3;;$', ';21;21;;' } else { # 不含-的行,替换行尾为;22;22;; $line = $line -replace ';3;3;;$', ';22;22;;' } } $line } # 输出到新文件,避免覆盖原文件 $outputLines | Out-File -Encoding ASCII "$($file.Name)-new.txt" }
脚本说明
- 用
ForEach-Object逐行处理文本,确保每一行单独判断 - 先执行第一个替换规则,避免后续判断冲突
- 通过
-match ';3;3;;$'精准检查行尾是否还需要处理 - 用
-like '*-*'判断行内是否包含短横线,分别执行对应替换 - 输出文件命名为原文件名加
-new.txt,防止误删原文件
补充优化
如果需要直接覆盖原文件(建议先备份),可以把输出部分改为:
$outputLines | Set-Content -Encoding ASCII $file.FullName
内容的提问来源于stack exchange,提问作者Mr DXF
相关产品推荐
相关产品推荐

