0

テキスト ファイル (*.sql) のコレクションを検索して、9 で始まる 8 桁の数字を探しています。ファイル内にこれらの数字の複数のインスタンスが存在するだけでなく、ファイルの各行に複数のインスタンスが存在する可能性があります。出力に、各ファイル内の各 8 桁の数字の一意の発生のみを表示したいだけです。これは私がこれまでに持っているものです:

Select-String "9[0-9]{8}" "*.sql" -AllMatches | Select-Object FileName, @{N="Value";E={ $_.matches |  %{$_.groups[0].value}}} | Select-Object  -unique FileName,Value  

そして、私の出力は次のようになります。

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      {907500507, 907520700, 907520701, 907520703...} 
File1.sql                      {907520725, 907520727, 907520728, 907520729} 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      {990603919, 990603925, 990603926} 
File2.sql                      {991100103, 991100103}
File2.sql                      {990700023, 990700504, 990700521, 990740520...} 
File3.sql                      907500044

等....

私がやりたいのは、配列を拡張して、 select -unique を介してパイプするときに、実際には各ファイルに含まれる一意の 8 桁の数字のみを取得することです。

これは私が望むものです:

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      907500507
File1.sql                      907520700
File1.sql                      907520701
File1.sql                      907520703 
File1.sql                      907520725
File1.sql                      907520727
File1.sql                      907520728
File1.sql                      907520729 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      990603919
File2.sql                      990603925
File2.sql                      990603926 
File2.sql                      991100103
File2.sql                      990700023
File2.sql                      990700504
File2.sql                      990700521
File2.sql                      990740520 
File3.sql                      907500044

等...

これどうやってするの?また、現在の powershell コマンドを改善できますか?

ありがとう!

4

2 に答える 2

0

コマンドを少し再フォーマットしました。PowerShell の省略形の簡潔な性質により、問題がわかりにくくなっていると思います。

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Select-Object FileName, @{N="Value";E={ $_.matches | %{$_.groups[0].value}}} | `
    Select-Object  -unique FileName,Value 

元のコマンドは、Select-String によって返された MatchInfo ごとに 1 つの出力行を生成します。MatchInfo は、テキスト ファイルの一致する行を表します。ファイル内の 1 行に複数の一致する値が含まれている場合、値の配列を取得していると思います。

各 MatchInfo の RegexMatch ごとに 1 つの出力オブジェクトが必要であることを明確にするために、これを修正しました。つまり、一致する値ごとに 1 つの出力オブジェクトが必要です。

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Foreach-Object { 
        # $_ is MatchInfo for each matching line in file
        $fileName = $_.FileName 
        $_.Matches | Foreach-Object { 
            # $_ is RegexMatch for each match in line
            $_ | Select-Object -Property @{N="FileName";E={$fileName} },Value
        } 
    } | Select-Object  -unique FileName,Value 
于 2014-05-15T18:09:44.797 に答える
0

わかりました、ほとんどあなたが持っているものを使い果たしています。Select-String で見つかったすべての一致に対して ForEach ループを実行し、それらをファイル名でグループ化しています。次に、ファイルごとに、Matches を展開するグループをループし、一致したテキストの一意の値のみを取得します。値ごとに、ファイルの名前と一致した値を含むオブジェクトを出力します。

ForEach($File in Select-String "9[0-9]{8}" "*.sql" -AllMatches | Group FileName){
    $File.group|select -expand matches|Select Value -Unique|%{
        new-object PSObject -property @{
            FileName=$File.Name
            Match=$_.value
        }
    }
}
于 2014-05-15T17:45:58.860 に答える