2016-11-27 12 views
1
私はこれを一致させる必要があるディレクトリ内のすべての* .vueファイル(それは、単純なテキスト形式です)、見つけるために、PowerShellコマンドを使用しています

マッチ複数行の文字列

7,Id 
6,Default

だから、これらは

ですが2つの連続した行。メモ帳で+ +私は行の最後にCRLFを参照してください。 Google検索に続いて、これは閉じる必要があります。

Get-ChildItem "D:\Wim\TM1\TI processes" -Filter *.vue -Recurse | 
    Select-String -Pattern "7,Id\r\n6,Default" -CaseSensitive | 
    Out-File C:\test.txt 

ただし、ファイルが見つかりません。最初の部分(7,Id)と2番目の部分(6,Default)が正しく見つかりましたが、改行との組み合わせは機能していません。

どのようなアイデアをお願いしますか?多分代替ですか?

私は回避策がありますが、それは非効率的で多くのコーディングです。たとえば、PowerShellを使用して最初のセンテンスのみのリストを作成し、これらのファイルを処理して2番目のセンテンスと一致するかどうかを調べることができます。私はそれを避けたい。 Select-String

答えて

1

ファイルの内容を単一の文字列として渡す必要があります。そうでない場合は、Select-Stringはパターンを各行に別々に適用します。 PowerShellのV3以降で

Get-ChildItem "D:\Wim\TM1\TI processes" -Filter *.vue -Recurse | ForEach-Object { 
    Get-Content $_.FullName | Out-String | 
    Select-String -Pattern "7,Id\r\n6,Default" -CaseSensitive | 
    Select-Object -Expand Matches | 
    Select-Object -Expand Groups | 
    Select-Object -Expand Value 
} | Out-File C:\test.txt 

あなたの代わりにGet-Content | Out-StringGet-Content -Rawを使用することができます。

あなたはWhere-Objectフィルターで-cmatchオペレータ使用することができますSelect-Stringする代わりに:交替を使用して

Get-ChildItem "D:\Wim\TM1\TI processes" -Filter *.vue -Recurse | ForEach-Object { 
    Get-Content $_.FullName | Out-String | Where-Object { 
    $_ -cmatch "7,Id\r\n6,Default" 
    } | ForEach-Object { 
    $matches[0] 
    } 
} | Out-File C:\test.txt 
+0

こんにちは、 奇妙な! 私は、Ansgar Wiechersの第2の提案が働いているが、一度だけ投稿する予定だった!私は何が起こっているのか分かりませんが、私のファイルC:\ test.txtに2行の結果があり、それ以来私はもう成功を再現できません。いいえC:\ test.txtが作成されます。 Ansgar Wiechersの最初の提案とjj27の提案は、最初からファイル "C:\ test.txt"を返さなかった。 フィードバックをいただきありがとうございます。 –

+0

ステップごとにパイプラインを確認します。 'Get-ChildItem'は関連するファイルをリストしていますか?彼らは実際に問題の行を含んでいますか? 'Where-Object'は実際に何かにマッチしますか? 'ForEach-Object'は関連する行を出力しますか?入力が変更されていない場合は、上記のステートメントが1回だけ機能する理由はありません。 –

+0

謝罪、それは自分でコピー/ペーストする方法でした。 SOからあなたのソリューションをコピーしたとき、私はペーストして>>の前に現れました。私は入って何も起こらなかった。それから私は1つの長い文を作成し、Enterを押すことを理解しました。ビンゴ!両方のソリューションが動作します、ありがとう!ただ1つのフォローアップの質問:2つの一致する行ではなく、出力テキストファイルにフルネーム(パスとファイル名)を付けることはできますか?それは完璧です。 –

0

-Patternパラメータができる正規表現であるので、これを試してください。

Get-ChildItem "D:\Wim\TM1\TI processes" -Filter *.vue -Recurse | 
    Select-String -Pattern "7,Id|6,Default" -CaseSensitive | 
    Out-File C:\test.txt 

垂直パイプバー(|)は別のセパレータとして作用する、または換言すれば、「または」演算子。パターンではどちらかと一致します。

+0

は、例えば、偽陽性を生成します文字列が間違った順序で表示されたり、それらのうちの1つが完全に欠けている場合 –

+0

実際、これらのラインを文字通り一致させる必要があります。その間に他のラインを入れることはできず、また正しい順序を適用する必要があります。 –