首页 > 解决方案 > 如果文本文件中包含字符串,则删除该行,然后删除接下来的两行

问题描述

我尝试使用 powershell 2 删除一行文本和接下来的 0 到 5 行,但这删除了我脚本中的所有内容。

我正在构建一个 PowerShell 脚本来解析 LMtools 输出。我有一条线可以取出任何未使用的东西

$body = (($body -split "`n") |
        Where-Object {$_ -notmatch 'Total of 0 licenses in use'}) -join "`n"

我不需要查看正在使用的软件包,因为以下两个许可证准确显示了正在使用的内容。

我需要删除带有 Users of Package: 的行以及以下两行。

所以这:

软件包用户:Autodesk AutoCAD:(已颁发 1 个许可证;总共 1 个许可证在使用中)
  “包:Autodesk AutoCAD”v1.000,供应商:adskflex,到期:永久(无到期日期)
    UserH ybw-w7-15021 ybw-w7-15021 (v1.000) (licenseserver/27000 490),开始星期一 2/25 10:38
软件包用户:AutoCAD - 包括专用工具集:(已颁发 1 个许可证;总共 1 个许可证在使用中)
  “包:AutoCAD - 包括专用工具集”v1.000,供应商:adskflex,到期:2020 年 2 月 15 日
    UserA DC18007-W10 DC18007-W10 (v1.000) (licenseserver/27000 114),开始星期一 2/25 10:50
Autodesk AutoCAD 2017 用户:(共颁发 4 个许可证;总共使用 1 个许可证)
  “Autodesk AutoCAD 2017”v1.000,供应商:adskflex,有效期:2020 年 2 月 15 日
    UserA DC18007-W10 DC18007-W10 (v1.0) (licenseserver/27000 214),开始星期一 2/25 10:50
Autodesk AutoCAD 2015 用户:(共颁发 4 个许可证;总共使用 1 个许可证)
  “Autodesk AutoCAD 2015”v1.000,供应商:adskflex,到期:永久(无到期日期)
    UserH DCw7-15021 DCw7-15021 (v1.0) (licenseserver/27000 390),开始星期一 2/25 10:38

就变成了这样:

Autodesk AutoCAD 2017 用户:(共颁发 4 个许可证;总共使用 1 个许可证)
  “Autodesk AutoCAD 2017”v1.000,供应商:adskflex,有效期:2020 年 2 月 15 日
    UserA DC18007-W10 DC18007-W10 (v1.0) (licenseserver/27000 214),开始星期一 2/25 10:50
Autodesk AutoCAD 2015 用户:(共颁发 4 个许可证;总共使用 1 个许可证)
  “Autodesk AutoCAD 2015”v1.000,供应商:adskflex,到期:永久(无到期日期)
    UserH DCw7-15021 DCw7-15021 (v1.0) (licenseserver/27000 390),开始星期一 2/25 10:38

标签: powershell

解决方案


您可以逐行读取输入,然后跳过匹配“包用户:”的行和接下来的两行。但是,由于您的整个输入文件似乎由 3 行组组成,因此我可能会使用Select-String否定的前瞻断言。

$pattern = '^Users of (?!Package:)'
Get-Content 'input.txt' | Select-String $pattern -Context 0,2 | ForEach-Object {
    $_.Line
    $_.Context.PostContext
} | Set-Content 'output.txt'

该模式匹配行首 ( ) 处的字符串“Users of”,^但后面没有字符串“Package:”。

使用-Context 0,2包括匹配的后续两个输入行。


推荐阅读