使用sed在文件中插入行号

6
我正在学习如何使用sed,并看到我可以使用=插入行号。然而,这会包括一个换行符:
文件:
alpha
beta
gamma

运行命令 sed -n '=;p' file
1
alpha
2
beta
3
gamma

在单个sed调用中,是否可以将这些行号“放在同一行上”? 所以:
1 alpha
2 beta
3 gamma

我知道使用其他工具也可以做到这一点,但我想了解sed的特定功能。是否有一种方法可以在“=”后附加另一个正则表达式替换,以去除换行符?

1
为什么要使用 sedawk -v ln=1 '{print ln++ " " $0 }' file - Wiktor Stribiżew
2
请参见 https://www.gnu.org/software/sed/manual/html_node/cat-_002dn.html#cat-_002dn。 - glenn jackman
3
“=” 命令实际上会打印行号,而不是将其插入到模式空间中。 “sed = file | paste - -” 是一个奇怪的方式来编写“nl file”。 - glenn jackman
不确定 sedawk 一样容易 这里 - Wiktor Stribiżew
可能是使用sed对匹配模式的行进行编号的重复问题。 - Wiktor Stribiżew
显示剩余2条评论
3个回答

12

这将是你的工作。

sed '=' file | sed 'N; s/\n/ /'

1
我的回答中似乎有两个sed调用。 :) - Paul
你能解释一下这里在做什么吗? - Yu Jiaao
@YuJiaao 只需在每行开头打印带有行号的文件即可。 :) - Paul
太好了!你知道如何在必要时用前导0填充数字吗? - xeruf
@Xerus,恐怕我不能用 sed 完成这个任务。但是一个解决方法可以是 awk '{printf("%0.2d %s\n", NR, $0)}' your_file_name - Paul
谢谢,这看起来更好了 :) 我通过插入以下内容解决了它:sed '=' | sed -r 's/^[0-9]$/0\0/' - xeruf

1
Both orders: 

echo -e "Jan J.\nKarel K.\nPetr P." |sed -rn "=;p;"|  sed -r "N;s/\n/ /;"
 1 Jan J.
 2 Karel K.
 3 Petr P.

echo -e "Jan J.\nKarel K.\nPetr P." |sed -rn "p;=;"|  sed -r "N;s/\n/ /;"
 Jan J. 1
 Karel K. 2
 Petr P. 3

echo -e "Jan J.\nKarel K.\nPetr P." |sed -rn "=;p;" |  sed -r "N;s/\n/ /;" | sed -r 's/^([0-9]*) (.*) (.*)$/\2 \1 \3/'
 Jan 1 J.
 Karel 2 K.
 Petr 3 P.

0
我在一个小抄https://quickref.me/sed.html中发现了这个不错的东西(我没有写它)。
文件的数字行(简单左对齐)
$ sed = file.txt | sed 'N;s/\n/\t/'

文件的行号(左侧数字,右对齐)
$ sed = file.txt | sed 'N; s/^/   /; s/ *\(.\{6,\}\)\n/\1  /'

文件的行号,但只有在行不为空时才打印数字
$ sed '/./=' file.txt | sed '/./N; s/\n/ /'

计算行数(模拟“wc -l”)
$ sed -n '$='

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接