2012-07-05 17 views
50

パイプの各行をスペースで分割し、それぞれのトークンをそれぞれの行に印刷したいと考えています。PowerShellで文字列を分割し、各トークンで何かを行う

(cat someFileInsteadOfAPipe).split(" ") 

しかし、私はより多くの柔軟性をしたい:

は、私が使用してこの結果を得ることができることを実現します。私は各トークンで何かをすることができるようにしたい。 (私はUnixでAWKを使用するために使用される、と私は同じ機能を取得しようとしている)

私は現在持っている:

明らかに、最初のトークンを印刷し、
echo "Once upon a time there were three little pigs" | %{$data = $_.split(" "); Write-Output "$($data[0]) and whatever I want to output with it"} 

。トークンの上にそれぞれ〜のための方法がありますか?

また、%{$data = $_.split(" "); Write-Output "$($data[0])"}の部分は私がブログから入手したもので、私がやっていることや構文がどういう仕組みか分かりません。

私はそれをGoogleにしたいが、私はそれを何と呼ぶべきか分からない。 Googleに言葉を2つ、または%とすべての$記号が何をするのかを説明するリンクと、開閉記号の意味を教えてください。

(cat someFileInsteadOfAPipe).split(" ")を実際に使用することができないことはわかっています。これは、ファイル(または望ましい受信パイプ)に複数の行が含まれているためです。回答の一部について

あなたがトークン化の前に、出力をフィルタリングするSelect-Stringを使用している場合、あなたはSelect-Stringコマンドの出力は、文字列のコレクションが、の集まりではないことを心に留めておく必要がありますMatchInfoオブジェクト。分割したい文字列を取得するには、あなたがMatchInfoオブジェクトのLineプロパティにアクセスする必要があり、そのよう:

cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")} 

答えて

100
"Once upon a time there were three little pigs".Split(" ") | ForEach { 
    Write-Host "$_ is a token" 
} 

キーは、パイプライン内の現在の変数を表しており、$_です。あなたがオンラインで見つけるコードについて

%ForEach-Objectの別名です。角括弧の中に囲まれているものは、受け取るオブジェクトごとに1回実行されます。この場合、1つの文字列だけを送信しているため、1回だけ実行されます。

$_.Split(" ")は、現在の変数を取り込み、スペースで分割しています。現在の変数は、現在ループされているものがForEachになります。

+1

aaaah、編集ありがとうございます。 '%'が 'foreach-object'の略語であることが分かっているということは、私が複数の行でこれを行うことができるということを意味します:' cat。\ tmp.txt | %{$ _。Split( "")} | %{Write-Output "$($ _)hello"} '問題が解決しました。 –

+2

パーフェクト!お役に立てて嬉しいです。あなたのコマンドの最後の部分は、実際には '' $ _ hello ''だけです。文字列内のオブジェクトのプロパティの値を拡張しようとしている場合は、$($変数)表記を使用する必要があります。たとえば、「私の姓は$($ person.surname)」です。「または、コマンドレットのメソッドの出力:明日の日付は$((Get-Date).AddDays(1))」です。 –

+11

ちょっとメモ:PowerShell v2では、 '-split'演算子があります。これは、一般的な空白(' -split $ foo')や 'に似ています。分割( '') ':' $ foo -split '' '。 – Joey

関連する問題