Получить строки для определенного региона - PullRequest
2 голосов
/ 15 июня 2019

Мне нужно использовать код powershell, чтобы получить строку определенной области

см. Рисунок ниже, содержимое зеленого прямоугольника необходимо сохранить, а все остальные строки удалить.

Я добавил несколько подстрок во второй области. Они выглядят сложнее. Я хочу знать, смогу ли я извлечь нужные данные сразу.

Нужно получить данные:

-------- [abc 不好]

[c 高速 缓存 / L1-кэш]

[内存 阵列 / Системная память]

-------- [太好 cde]

enter image description here

--------[ 好吗 ]----------------------------------------------------------------------------------------------

    string1                                              description1
    string4                                          ---[ 太好了 ]----description4好

--------[ abc不好 ]----------------------------------------------------------------------------------------------------

  [ a系统 ]

    系统:
      制造商                                            Intel Corporation
      产品                                              HuronRiver Platform


  [ 主板 ]

    主板:
      制造商                                            Intel Corp.
      产品                                              Emerald Lake
      版本                                              V1.24                                       

  [ c高速缓存 / L1-Cache ]

    高速缓存:
      类型                                              数据
      状态                                              已启用


  [ 高速缓存 / L2-Cache ]

    高速缓存:
      类型                                              数据
      状态                                              已启用

  [ d高速缓存 / L3-Cache ]

    高速缓存:
      类型                                              Unified
      状态                                              已启

  [ 内存阵列 / System Memory ]

    内存阵列:
      位置                                              主板
      内存阵列功能                                      系统内存

  [ 内存设备 / ChannelA-DIMM0 ]

    内存设备:
      形状特征                                          SODIMM
      类型                                              DDR3


--------[ cde好 ]---------------------------------------------------------------------------------------------------------

    好string1                                              description1
    string3                                              description3
    string4                                          ---[ 太好了 ]----description4好a


--------[ 太好cde ]----------------------------------------------------------------------------------------------------


    了string1                                              description1
    string3                                              description3
    string4                                          ---[ 太好了 ]----description4好b


--------[ hef好 ]----------------------------------------------------------------------------------------------------

    好string1                                              description1
    string3                                              description3
    string4                                          ---[ 太好了 ]----description4好

Ответы [ 2 ]

3 голосов
/ 15 июня 2019

Скорее всего, мы можем начать с выражения, которое будет собирать новые строки:

.*(\[ ddf \]|\[ edf \])[\s\S]*?description4\s*

Демо 1

.*(\[ ddf \]|\[ edf \])[\s\S]*?\s*(?<=--------\[)

Демо 2

.*(\[ ddf \]|\[ edf \])[\s\S]*?\s*\n(?:-)

Демо 3

Если бы в описании 4 была фиксированная подстрока, мы можем просто использовать это, например:

.*(\[ ddf \]|\[ edf \])[\s\S]*?---\[ \?\?\?\? \]----.+\s*

Демо 4

.*(\[ .*abc.* \]|\[ .*cde \])[\s\S]*?\]----.+\s*

Демо 5


Edit:

Поскольку у нас есть динамические шаблоны, и они будут меняться в зависимости от наших входных данных, мы будем использовать только одно правило для каждого, получая неповторяющуюся уникальную подстроку в верхнем левом углу и неповторяющуюся уникальную подстроку из внизу справа, и мы разработали бы наше выражение, а затем соединили бы их, используя логические ИЛИ:

(.*(\[ .*系统概述.* \][\s\S]*?LapTop\s*)|(.*\[ AIDA64 Extreme \][\s\S]*?10:14\s*)|(.*\[ DMI \])[\s\S]*?HuronRiver CRB.+\s*)

Демо 6

(.*(\[ .*TOP LEFT.* \][\s\S]*?Bottom RIGHT.*\s*))|(.*(\[ .*TOP LEFT.* \][\s\S]*?Bottom RIGHT.*\s*))

Демо 7

1 голос
/ 15 июня 2019

Если исходить из файла, я бы

  • Get-Content file.txt -raw и
  • разбито на секции, определяемые началом строки линейки с прогнозом
  • используйте Where-Object для фильтрации по уникальному слову внутри раздела

$Unique = [regex]::Escape("[ abc")
(Get-Content .\file.txt -raw) -split '(?M)(?=^--------\[)' -ne '' |
    Where-Object { $PSItem -match $Unique}

Пример вывода:

--------[ abc不好 ]----------------------------------------------------------------------------------------------------

    好string1                                              description1
    string2                                         description2
    好string3                                              description3
    string4                                          ---[ 太好了 ]----description4好2

РЕДАКТИРОВАТЬ: адаптированный скрипт для измененных требований

$Unique = 'abc不好|太好cde|c高速缓存 \/ L1-Cache|内存阵列 \/ System Memory'
(Get-Content .\SU_56606905.txt -raw) -split '(?M)(?=(^--------\[|^  \[))'|
    Where-Object { $PSItem -match $Unique}

Пример вывода:

--------[ abc不好 ]----------------------------------------------------------------------------------------------------


  [ c高速缓存 / L1-Cache ]

    高速缓存:
      类型                                              数据
      状态                                              已启用



  [ 内存阵列 / System Memory ]

    内存阵列:
      位置                                              主板
      内存阵列功能                                      系统内存


--------[ 太好cde ]----------------------------------------------------------------------------------------------------


    了string1                                              description1
    string3                                              description3
    string4                                          ---[ 太好了 ]----description4好b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...