我有一个文本文件,在每行上都有这种形式的句子:
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 - ?'
但是他们都没有工作, 请问有人有什么主意或提示可以帮助我吗?
答案 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_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
的更多信息,请参见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