61

パイプの各行をスペースで分割し、各トークンを独自の行に出力したいと考えています。

次を使用してこの結果を取得できることを認識しています。

(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"}

明らかに、これは最初のトークンのみを出力します。トークンを for-each して、それぞれを順番に印刷する方法はありますか?

また、%{$data = $_.split(" "); Write-Output "$($data[0])"}ブログから入手した部分ですが、何をしているのか、構文がどのように機能するのか本当にわかりません。

グーグルで検索したいのですが、何と呼べばいいのかわかりません。Google に 1 つか 2 つの単語を教えてください。または、%とすべての$記号が何をするのかを説明するリンクと、開き括弧と閉じ括弧の意味を教えてください。

(cat someFileInsteadOfAPipe).split(" ")ファイル(または望ましい受信パイプ)に複数の行が含まれているため、実際には使用できないことに気付きました。

いくつかの答えについて:

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

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

4 に答える 4

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

キーは$_、パイプラインの現在の変数を表すです。

オンラインで見つけたコードについて:

%のエイリアスですForEach-Object。角かっこで囲まれたものはすべて、受け取るオブジェクトごとに1回実行されます。この場合、単一の文字列を送信しているため、1回だけ実行されます。

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

于 2012-07-05T16:38:49.860 に答える
3

Justus Thane の役立つ回答を補足するには:

  • Joeyがコメントで指摘しているように、PowerShell には強力な正規表現ベースの-split operatorがあります。

    • 単項形式 ( -split '...') では、のデフォルトのフィールド分割 の-splitように動作awkします。つまり、次のことを意味します。
      • 先頭と末尾の空白は無視されます。
      • 一連の空白 (たとえば、複数の隣接するスペース) は、 1 つの区切り文字として扱われます。
  • PowerShell v4+ ではこのブログ投稿で説明されているように、コマンドレットに代わるForEach-Object .ForEach()式ベースの (したがってより高速な) 配列 (コレクション) メソッドが利用できるようになりました(メソッドと並んで、より強力な式ベースの の代替手段)。.Where()Where-Object

これらの機能に基づくソリューションは次のとおりです。

PS> (-split '   One      for the money   ').ForEach({ "token: [$_]" })
token: [One]
token: [for]
token: [the]
token: [money]

先頭と末尾の空白は無視され、 と の間の複数の空白は 1 つの区切り文字として扱われたことに注意してOneくださいfor

于 2018-05-04T14:15:25.697 に答える