PowerShell 中与 Bash 的 cat -n 等效的是什么?

PowerShell 中与 Bash 的 cat -n 等效的是什么?

我想要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因为这允许进一步处理输出。
  • echowrite-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

相关内容