我想要cat
一个文件并输出它输出的每一行的行号。
然而,在 PowerShell 中,cat
输出的是数组。因此,问题实际上变成了:如何在将每个项目输出到控制台时打印其索引……?
我尝试了这样的事情:
$k = cat foo.js
$k | foreach { $index = $k.IndexOf($_) + 1; write "$index : $_"; } | more
它给了我一些奇怪的结果。一些行号重复了。有什么优雅且更可靠的方法可以做到这一点?
答案1
我想要 cat 一个文件并输出它输出的每一行的行号。
使用以下命令:
$counter = 0; get-content .\test.txt | % { $counter++; write-host "`t$counter` $_" }
正如评论中指出的那样:
- 最好使用
write-output
而不是write-host
因为这允许进一步处理输出。 echo
是write-output
因此上述命令变成:
$counter = 0; get-content .\test.txt | % { $counter++; echo "`t$counter` $_" }
示例输出:
> type test.txt
foo
//approved
bar
// approved
foo
/*
approved
*/
bar
> $counter = 0; get-content .\test.txt | % { $counter++; echo "`t$counter` $_" }
1 foo
2 //approved
3 bar
4 // approved
5 foo
6 /*
7 approved
8 */
9 bar
>
用于比较的Cygwin 输出示例cat -n
:
$ cat -n test.txt
1 foo
2 //approved
3 bar
4 // approved
5 foo
6 /*
7 approved
8 */
9 bar
$
答案2
您可能会滥用 Select-String 来实现这一点:
Select-String -Pattern .* -Path .\foo.txt | select LineNumber, Line
示例输出:
LineNumber Line
---------- ----
1 a
2
3 b
4
5 c
答案3
IndexOf()
将匹配第一的值的出现次数,因此使用原始代码的重复行号意味着文件中有几行是相同的。请尝试以下操作:
$k = Get-Content -Path foo.js
$l = 0
while ($l -lt $k.length) {
"{0,5}: {1}" -f $l,$k[$l]
$l++
}
答案4
与 DavidPostill 的代码类似,但带有右对齐的数字,如 cat -n
$cnt=0;gc .\test.txt|%{$cnt++;"{0,6} {1}" -f $cnt,$_}
或者得到相同的结果:
select-string -path .\test.txt "^" |%{"{0,6} {1}" -f $_.LinenUmber,$_.Line}
示例输出:
PS> $cnt=0;gc .\test.txt |%{$cnt++;"{0,6} {1}" -f $cnt,$_}
1 foo
2 //approved
3 bar
4 // approved
5 foo
6 /*
7 approved
8 */
9 bar