按顺序增加sed输出流中的数字

时间:2012-11-14 13:48:36

标签: sed

我有一个小的sed脚本,应该在第一个“黄狮子”发生前打印“动物王1:”,“动物王2:”在第二个“黄狮子”和“动物王3”前面打印: “在第三个”黄狮“面前发生。是否有可能在sed中实现这一目标?

sed和output的输入文件内容可以在这里看到:

[user@T60 ~]$ cat animals.txt 
red cat
blue dog
yellow lion
brown tiger
black hippo
yellow lion
white zebra
yellow lion
[martint@martint ~]$ cat sed-test.sh 
#!/usr/bin/env bash

sed 's/\(.*lion\)/\
\
animal king 1:\
\
\1 /' < "animals.txt"
[user@T60 ~]$ ./sed-test.sh 
red cat
blue dog


animal king 1:

yellow lion 
brown tiger
black hippo


animal king 1:

yellow lion 
white zebra


animal king 1:

yellow lion 
[user@T60 ~]$ 

正如你所看到的,“动物之王”号在所有三次出现中都是“1”。有没有办法在sed中的每个“。* lion”匹配后增加一个?

2 个答案:

答案 0 :(得分:3)

这可能适合你(GNU sed):

sed -re '/^.*lion/!b;w lion_file' -e 'g;s/[0-9]9*$/\n&/;h;y/0123456789/1234567890/;G;s/^.*\n(.*)\n(.*)\n.*/\2\1/;s/^(0*)\n*$/1\1/;h;s/^.*/\n\nanimal king &:\n/;R /lion_file' file

这有点像作弊,因为它使用临时文件来保存lion行。

答案 1 :(得分:2)

使用awk更具可读性:

awk '/lion/ {printf("\nanimal kingdom %d:\n\n", ++n)} 1' animals.txt