頻繁に使用するsed/perl/etcの「one-liner」コマンドがいくつかあります。
head -1
(ファイルの最初の行を印刷します)sed $d
(ファイルの最後の行を削除します)perl -pe '$_ = qq($. $_)'
(ファイルの数直線)
あなたはその考えを理解します。
これらのコマンドはすべて同じ動作をします。標準の入力から入力を取得することも、名前が引数として渡される一連のファイルを処理することもできます。これらの一般的なスクリプトをPowershell関数としてまとめたいので、使用する正確な構文を覚えておく必要はありません。ただし、エイリアスはそのようには機能しません。関数を使用して「明らかな」アプローチを実行すると、次のようになります。
function numlines {
perl -pe '$_ = qq($. $_)' $args
}
引数としてファイルを処理しますが(numlines my_file.pl
)、パイプからの入力を処理しません(cat my_file.pl | numlines
)。
双方向で機能するように関数を作成する方法はありますか?
明確にするために-私はこれを行うためにbatファイルを使用することができます。たとえば、numlines.batには
@perl -pe "$_ = qq($. $_)" %*
しかし、cmd.exeとbatファイルの一般的な醜さを呼び出さなければならない(CTRL-C :-()を押したときに「バッチジョブの終了(Y / N)?」プロンプトが表示されるので、Powershell内の同様に単純なソリューションが必要です。 。
以下のリチャードの提案に基づいて、私は試しました:
function test {
[CmdletBinding()]
param(
[Parameter(mandatory=$true, ValueFromPipeline=$true)]
$data
)
process {
perl -pe '$_ = qq($. $_)'
}
}
次に実行するとtest file.txt
(これと同じように効果的に実行したいperl -pe '$_ = qq($. $_)' file.txt
)、関数は実行されますが、処理ではなく標準入力でデータを待機しますfile.txt
。私が試したときにも同じことが起こりますcat file.txt | test
-これはと同じように動作することを期待していcat file.txt | perl -pe '$_ = qq($. $_)'
ます。