从获取内容命令中筛选正则表达式结果



我有一个文本文件,每行都有一个这样的句子:

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 - ?'

但他们都没有工作,有人有想法或只是帮助我的线索吗?

以下使用 -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的Lieven(。您还可以在此处使用 Group-Object 来获取 .name 属性,该属性将输出唯一的字符串。请参阅about_Split和排序对象。另请参阅组对象。

如果你对正则表达式死定了,你可以使用 -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的详细信息。

对组进行分组可能更有趣:

> 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

最新更新