我有许多我经常使用的 sed/perl/etc “单行”命令:
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 文件的一般丑陋(即“终止批处理作业(Y/N)?”当您按下 CTRL-C :-() 时的提示让我希望在 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($. $_)'
.