我有一个名为test_file.txt的文件。第二行具有4个管道定界符,除第二行以外的所有其他行均具有3个管道定界符。我只想输出第2行,因为它比其他行多了一个定界符。
$colCnt = "C:\test.txt"
[int]$LastSplitCount = $Null
Get-Content $colCnt | ?{$_} | Select -Skip 1 | %{if($LastSplitCount -and !
($_.split("|").Count -eq $LastSplitCount))
{"Process stopped at line number $($_.psobject.Properties.value[5]) for column count mis-match.";break}
elseif(!$LastSplitCount){$LastSplitCount = $_.split("|").Count}}
如果您的文本文件看起来像这样:
blah|using|three|delimiters blah|using|four |delimiter |characters blah|using|three|delimiters blah|using|four |delimiter |characters blah|using two |delimiters
以下代码应该输出多于(或少于)3个|
分隔符的行:
$line = 0
switch -Regex -File "C:\test.txt" {
'^(?:[^|]*\|){3}[^|]*$' { $line++ } # this line is OK, just increase the line counter
default { "Bad delimiter count in line {0}: '{1}'" -f ++$line, $_ }
}
输出:
Bad delimiter count in line 2: 'blah|using|four |delimiter |characters' Bad delimiter count in line 4: 'blah|using|four |delimiter |characters' Bad delimiter count in line 5: 'blah|using two |delimiters'
正则表达式详细信息:
^在字符串开头声明位置(?:匹配下面的正则表达式[^ |]匹配非“ |”的任何字符*在零到无限次之间,尽可能多地重复,并根据需要进行回馈(贪婪)\ |匹配字符“ |”从字面上看){3}恰好3次[^ |]匹配非“ |”的任何字符*在零到无限次之间,尽可能多地重复,并根据需要进行回馈(贪婪)$在字符串结尾处声明位置(或在字符串结尾处的换行符之前,如果有的话)