【问题标题】:Remove line in text file if it contains string and then remove the next two lines如果文本文件中包含字符串,则删除该行,然后删除接下来的两行
【发布时间】:2019-02-26 03:16:09
【问题描述】:

我尝试了Remove a line of text and the next 0 to 5 lines with powershell 2,但这删除了我脚本中的所有内容。

我正在构建一个 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

【问题讨论】:

  • 您创建此文件的代码意味着每组 3 行开始一个行。这是真的吗?

标签: powershell


【解决方案1】:

您可以逐行读取输入内容,然后跳过匹配“Users of Package:”的行以及接下来的两行。但是,由于您的整个输入文件似乎由 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 包括匹配的后续两行输入。

【讨论】:

  • @SomethingSysadmin $body 是单个字符串吗?那是行不通的。您需要将输入作为行数组。
  • 成功了,有什么好方法可以将它从文件更改为 $body?
  • @SomethingSysadmin 见上文。 ;) 您可以在换行符处拆分 $body 以获得所需的输入。
  • 嗯,我在其他地方分行,也许我可以做类似的事情。 pastebin.com/0FPcSqzW
猜你喜欢
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 2022-01-03
  • 2017-11-16
相关资源
最近更新 更多