打印文件中的行范围,并包括行号

打印文件中的行范围,并包括行号

我有一个sedoneliner,用于打印文件中的行范围:

sed -n '10,20p' file.txt

上面的代码将打印 file.txt 中的第 10 行到第 20 行。

但我怎样才能打印行号呢?

答案1

尝试awk

awk 'FNR==10,FNR==20 {print FNR ":" $0}' file.txt

这将打印行号、冒号,然后打印第 10 到 20 行范围内的行。

或者在第 20 行之后停止阅读:

awk 'FNR >= 10 {print FNR ":" $0}; FNR == 20 {exit}' file.txt

如果处理多个文件并且您的awk实现支持该nextfile指令:

awk -v OFS=: 'FNR >= 10 {print FILENAME, FNR, $0}; FNR == 20 {nextfile}' ./*.txt

(这里还打印当前文件名)。

答案2

sed=打印行号的命令。

sed -n '10,20{=;p}' file.txt

但是,它会在实际行上方的单独行中打印行号。

如果你想在实际行的同一行中加上行号,你可以使用管道nlsed

nl file.txt | sed -n '10,20p'

您可能需要设置一些nl标志以使输出更好。我将其别名为alias nl='nl -b a -n rz -s "|" -w1',以便用作|数字和行之间的分隔符、右对齐数字等。

答案3

仅使用sed.

sed -n '10,20{=;p}' file.txt | sed '{N; s/\n/ /}'
  • N;告诉sed将下一行添加到模式空间中,因此现在sed正在处理这两行。
  • s/\n/ /用空格替换换行符,将两行“合并”在一起。

资料来源:

解释者阿拉·阿里(来源2)

答案4

$ < file grep -ne '^' | sed -ne '10,20p'

$ < file sed -e '10,20!d;=;20q' | paste -d: - -

Not so UUOC:
$ cat -n file | sed -nEe '10,20s/^\s*(\S+)\t/\1:/p'

$ perl -lne 's/^/$.:/;
    print if 10..20;
    last  if 20..20;
' file 

相关内容