从get-content命令过滤正则表达式结果

时间:2019-04-10 13:32:39

标签: regex powershell

我有一个文本文件,在每行上都有这种形式的句子:

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 个答案:

答案 0 :(得分:2)

以下使用-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_SplitSort-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的更多信息,请参见About Comparison Operators

答案 1 :(得分:0)

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

> 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