ファイル内のパターンを見つけようとしています。 Select-String
を使用して一致する場合、行全体が必要ではなく、一致した部分のみが必要です。
これを行うために使用できるパラメーターはありますか?
例えば:
私がやったら
select-string .-.-.
ファイルには次の行が含まれていました。
abc 1-2-3 abc
行全体が返されるのではなく、単に1-2-の結果を取得したいと思います。
Powershellでgrep -o
に相当するものを知りたい
デビッドは正しい道を歩んでいます。 [regex]はSystem.Text.RegularExpressions.Regexの型アクセラレーターです
[regex]$regex = '.-.-.'
$regex.Matches('abc 1-2-3 abc') | foreach-object {$_.Value}
$regex.Matches('abc 1-2-3 abc 4-5-6') | foreach-object {$_.Value}
冗長すぎる場合は、関数でラップできます。
あるいは単に:
Select-String .-.-. .\test.txt -All | Select Matches
他のアプローチを試してみました:Select-Stringは、使用可能なプロパティMatchesを返します。すべての一致を取得するには、-AllMatchesを指定する必要があります。それ以外の場合は、最初のもののみを返します。
私のテストファイルの内容:
test test1 alk atest2 asdflkj alj test3 test
test test3 test4
test2
スクリプト:
select-string -Path c:\temp\select-string1.txt -Pattern 'test\d' -AllMatches | % { $_.Matches } | % { $_.Value }
戻り値
test1 #from line 1
test2 #from line 1
test3 #from line 1
test3 #from line 2
test4 #from line 2
test2 #from line 3
の精神で男に魚を教える ...
実行するのは、select-stringコマンドの出力をGet-memberにパイプすることです。これにより、オブジェクトのプロパティを確認できます。これを行うと、「Matches」が表示されます。出力を| **Select-Object** Matches
。
私の提案は、次のようなものを使用することです:行番号、ファイル名、一致を選択
例:stejのサンプル:
sls .\test.txt -patt 'test\d' -All |select lineNumber,fileName,matches |ft -auto
LineNumber Filename Matches
---------- -------- -------
1 test.txt {test1, test2, test3}
2 test.txt {test3, test4}
3 test.txt {test2}
上記の答えはどれも私にとってはうまくいきませんでした。以下がやった。
Get-Content -Path $pathToFile | Select-String -Pattern "'test\d'" | foreach {$_.Matches.Value}
Get-Content -Path $pathToFile | # Get-Content will divide into single lines for us
Select-String -Pattern "'test\d'" | # Define the Regex
foreach {$ _。Matches.Value}#ObjectのMatchesフィールドの値のみを返します。 (これにより、複数の結果の一致が可能になります。)
System.Text.RegularExpressions名前空間を使用できます。
http://msdn.Microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx