首页 > 解决方案 > 从 get-content 命令过滤正则表达式结果

问题描述

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

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

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

标签: regexpowershell

解决方案


使用以下解决方案-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]从结果拆分中获取第一项 ( )。管道 intoSort-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.


推荐阅读