使用基于表达式的“列”进行Powershell字符串排序

时间:2017-05-15 00:13:47

标签: powershell sorting

假设我有一个像这样的字符串集合,没有特别的顺序:

"Filename (Text) (Comment)"
"Filename (Word) (1)"
"Filename (Word) (1) (Bad)"
"Filename (Text) (2)"
"Filename (Picture)"
"Filename (Misc)"
"Filename (Misc) (1)"
"Filename (Picture) (1)"
"Filename (Audio)"
"Filename (Audio) (Comment) (1)"

我想按照这样排序:

"Filename (Text) (2)"
"Filename (Word) (1)"
"Filename (Text) (Comment)"
"Filename (Audio) (Comment) (1)"
"Filename (Audio)"
"Filename (Picture) (1)"
"Filename (Picture)"
"Filename (Misc) (1)"
"Filename (Misc)"
"Filename (Word) (1) (Bad)"

换句话说,我想按以下顺序排序:(坏)到(Bad)s顶部的底部(文本/单词,音频,图片),然后排序(2,1,[空白] )。

请注意,我希望Text和Word聚集在一起,然后按括号中的数字排序,我不关心任何与那些不匹配的东西,所以我不关心(评论)。

目前我收到了这个:

"Filename (Word) (1)"
"Filename (Text) (2)"
"Filename (Text) (Comment)"
"Filename (Audio) (Comment) (1)"
"Filename (Audio)"
"Filename (Picture) (1)"
"Filename (Picture)"
"Filename (Misc) (1)"
"Filename (Misc)"
"Filename (Word) (1) (Bad)"

所以我非常接近得到我想要的东西。

这就是我正在做的事情:

$badExpression = { if ($_ -match '\((Bad)\)') { $matches[1] } }
$documentExpression = { if ($_ -match '\((Text|Word)\)') { $matches[1] } }
$soundExpression = { if ($_ -match '\((Audio)\)') { $matches[1] } }
$imageExpression = { if ($_ -match '\((Picture)\)') { $matches[1] } }
$numberExpression = { if ($_ -match '\((2|1)\)') { $matches[1] } }

"Filename (Text) (Comment)", "Filename (Word) (1)", "Filename (Word) (1) (Bad)", `
    "Filename (Text) (2)", "Filename (Picture)", "Filename (Misc)", "Filename (Misc) (1)", `
    "Filename (Picture) (1)", "Filename (Audio)", "Filename (Audio) (Comment) (1)" | Sort-Object `
@{Expression = $badExpression; Descending = $false}, `
@{Expression = $documentExpression; Descending = $true}, `
@{Expression = $soundExpression; Descending = $true}, `
@{Expression = $imageExpression; Descending = $true}, `
@{Expression = $numberExpression; Descending = $true}

我肯定误解了我的表达式究竟是如何应用于排序的。我有一种预感,也许我必须做一系列排序对象,但我无法弄清楚是什么。

只是为了得出焦点:我遇到的问题是(Word)和(Text)应该被排序,好像它们是相同的。

编辑:好的,我认为我现在得到了我想要的行为,这是一个微妙的变化,请参阅我添加的-replace。

$badExpression = { if ($_ -match '\((Bad)\)') { $matches[1] } }
$documentExpression = { if ($_ -match '\((Text|Word)\)') { $matches[1] -replace ".*",'Document'} }
$soundExpression = { if ($_ -match '\((Audio)\)') { $matches[1] } }
$imageExpression = { if ($_ -match '\((Picture)\)') { $matches[1] } }
$numberExpression = { if ($_ -match '\((2|1)\)') { $matches[1] } }

"Filename (Text) (Comment)", "Filename (Word) (1)", "Filename (Word) (1) (Bad)", `
    "Filename (Text) (2)", "Filename (Picture)", "Filename (Misc)", "Filename (Misc) (1)", `
    "Filename (Picture) (1)", "Filename (Audio)", "Filename (Audio) (Comment) (1)" | Sort-Object `
@{Expression = $badExpression; Descending = $false}, `
@{Expression = $documentExpression; Descending = $true}, `
@{Expression = $soundExpression; Descending = $true}, `
@{Expression = $imageExpression; Descending = $true}, `
@{Expression = $numberExpression; Descending = $true}

所以对于互联网点:我的脚本做什么(除了工作),我想更好地理解它。 :)我理解松散地发生了什么,但我想更好地掌握它。

1 个答案:

答案 0 :(得分:1)

它不直接。但我宁愿首先将它排序为自然

Get-Content C:\folder\String.txt | Sort-Object $ToNatural

然后至少你会直接获得这样的O / p(按音频,杂项,图片,文本排序):

"Filename (Audio) (Comment) (1)"
"Filename (Audio)"
"Filename (Misc) (1)"
"Filename (Misc)"
"Filename (Picture) (1)"
"Filename (Picture)"
"Filename (Text) (2)"
"Filename (Text) (Comment)"
"Filename (Word) (1) (Bad)"
"Filename (Word) (1)"

之后,您可以根据需要使用一些正则表达式进行匹配。如果这种方法可以帮助您,请告诉我。