отфильтровать результат регулярного выражения из команды get-content - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть текстовый файл, в каждой строке которого есть предложение этой формы:

XXXX - hi XXXX - hello XXXX - whatever WW - blabla WW - blblbl CCC - nice CCC - common CCC - itsux CCC - regex BBBB_BBB - flibidibalala

я пытаюсь создать регулярное выражение с powershell для сортировкиэто содержимое выглядит так:

XXXX WW CCC BBBB_BB

Я хочу отсортировать первые строки файла так, чтобы перед «-» была только одна часть.Я пробовал что-то вроде этого:

Get-Content coucou2.txt -Filter '(\w - )?'

Get-Content coucou2.txt -Filter '\w - ?'

Get-Content coucou2.txt -Filter '\w - {1}'

Get-Content coucou2.txt -Filter '(\w - ){1}'

Get-Content coucou2.txt | Select-String '\w - {1}'

Get-Content coucou2.txt | Select-String '(\w - ){1}'

Get-Content coucou2.txt | Select-String '(\w - )?'

Get-Content coucou2.txt | Select-String '\w - ?'

Но ни один из них не сработал, у кого-то есть идея или простоподсказка, чтобы помочь мне, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Будет достаточно следующего решения с использованием -Split.

# sort.txt file contains the strings in your example randomized
Get-Content sort.txt

WW - blblbl
CCC - nice
CCC - itsux
CCC - regex
BBBB_BBB - flibidibalala
XXXX - whatever
WW - blabla
CCC - common
XXXX - hello
XXXX - hi

# Code to sort and output sorted strings
Get-Content sort.txt | ForEach-Object {
  ($_ -split " - ")[0]} | Sort-Object -Desc -Unique

XXXX
WW
CCC
BBBB_BBB

Приведенный выше метод разбивает (-split) каждую строку (по одной за раз), ограничивая ее -, а затем захватывает первый элемент ([0]) из полученного разбиения. Канал в Sort-Object сортируется в порядке убывания (-Desc) и выводит только уникальные объекты (-Unique) (cudo's Lieven ) . Вы также можете использовать Group-Object здесь, чтобы получить свойство .name, которое будет выводить уникальные строки. См. about_Split и Sort-Object . Также см. Group-Object .

Если вы задали регулярное выражение, вы можете использовать оператор -replace, но это включает дубликаты:

(Get-Content sort.txt) -Replace "(\w+) - .*",'$1' | Sort-Object -Desc

XXXX
XXXX
XXXX
XX
WW
WW
CCC
CCC
CCC
CCC
BBBB_BBB
BB

Используя тот же метод, что и выше, без дубликатов:

(Get-Content sort.txt) -Replace "(\w+) - .*",'$1' | Sort-Object -Desc -Unique

XXXX
XX
WW
CCC
BBBB_BBB
BB

См. Об операторах сравнения для получения дополнительной информации о -Replace.

0 голосов
/ 10 апреля 2019

Группировка ваших групп может быть более интересной:

> Get-Content .\coucou2.txt|Group-Object {($_ -split ' ')[0]}

Count Name                      Group
----- ----                      -----
    3 XXXX                      {XXXX - hi, XXXX - hello, XXXX - whatever}
    2 WW                        {WW - blabla, WW - blblbl}
    4 CCC                       {CCC - nice, CCC - common, CCC - itsux, CCC - regex}
    1 BBBB_BBB                  {BBBB_BBB - flibidibalala}

> Get-Content .\coucou2.txt|Group-Object {($_ -split ' ')[0]} -NoElement

Count Name
----- ----
    3 XXXX
    2 WW
    4 CCC
    1 BBBB_BBB

> (Get-Content .\coucou2.txt|Group-Object {($_ -split ' ')[0]} -NoElement).Name
XXXX
WW
CCC
BBBB_BBB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...