我在做实验中发现我有一个需求:自动生成 MCNP 输入文件的脚本有 bug ,也就是某某卡的最后一行会多出来一个空行(大概率因为程序里自带换行了,导致最后一行刹不住车),这就直接导致了程序报错。
下面我用一个脚本解决这个问题。
例如,目前的情况是:
...
728 py 729.5
1000 so 2000
...
想删除多出来的空行,基本思路就是检查当前行是否为空行,然后匹配空行的上下两行,如果匹配成功,就跳过该空行(不添加到新内容中)。
实现代码如下:
param (
[string]$path = "." # 指定搜索的路径,默认为当前目录
)
# 使用 Get-ChildItem 获取指定路径下所有扩展名为 .txt 的文件,并递归搜索子目录
Get-ChildItem -Path $path -Filter *.txt -Recurse | ForEach-Object {
Write-Host "正在处理文件: $($_.FullName)"
# 读取文件内容
$content = Get-Content $_.FullName
# 创建一个新数组来存储处理后的内容
$newContent = @()
$emptyLinesRemoved = 0
# 遍历每一行
for ($i = 0; $i -lt $content.Count; $i++) {
$currentLine = $content[$i]
# 检查当前行是否为空行
if ($currentLine.Trim() -eq "") {
# 检查上一行是否匹配 "728 py 729.5" 模式(允许开头有空格)
$prevLine = if ($i -gt 0) { $content[$i-1] } else { "" }
$isPrevMatch = $prevLine -match "^\s*728\s+py\s+729\.5"
# 检查下一行是否匹配 "1000 so 2000" 模式(允许开头有空格)
$nextLine = if ($i -lt $content.Count - 1) { $content[$i+1] } else { "" }
$isNextMatch = $nextLine -match "^\s*1000\s+so\s+2000"
# 调试信息
if ($isPrevMatch -or $isNextMatch) {
Write-Host "行 $i : 发现可能的模式匹配"
Write-Host " 上一行: '$prevLine' (匹配: $isPrevMatch)"
Write-Host " 当前行: '$currentLine'"
Write-Host " 下一行: '$nextLine' (匹配: $isNextMatch)"
}
# 如果上下行都匹配特定模式,则跳过这个空行(不添加到新内容中)
if ($isPrevMatch -and $isNextMatch) {
Write-Host " -> 删除位置 $i 的空行"
$emptyLinesRemoved++
continue
}
}
# 将当前行添加到新内容中
$newContent += $currentLine
}
# 如果有空行被删除,才写入文件
if ($emptyLinesRemoved -gt 0) {
Write-Host " 从此文件中删除了 $emptyLinesRemoved 个空行"
# 将修改后的内容写回文件
Set-Content $_.FullName -Value $newContent -Encoding UTF8
} else {
Write-Host " 在此文件中未找到匹配的空行"
}
Write-Host ""
}
Write-Host "处理完成。"
将代码写入某空白 txt 文件,命名为 RemoveSpecificEmptyLines.ps1 ,编码保存为 UTF-8 BOM 格式(不然会报错),然后把需要替换的 txt 文件和脚本放在相同文件中,按住 shift ,鼠标右键打开 Powershell 窗口,输入以下命令即可。
.\RemoveSpecificEmptyLines.ps1

结果很成功~
具体的匹配模板需要自己修改正则表达式,我专门添加了调试反馈,应该会很有帮助。

233

被折叠的 条评论
为什么被折叠?



