1

我有一个小 sed 脚本,它应该在第一个“黄色狮子”出现之前打印“动物王 1:”,在第二个“黄色狮子”之前打印“动物王 2:”,在前面打印“动物王 3:”第三次“黄狮”事件。是否有可能在 sed 中实现这一点?

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

[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”匹配之后将其增加一?

4

2 回答 2

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行。

于 2012-11-14T16:06:51.687 回答
2

使用 awk 更具可读性:

awk '/lion/ {printf("\nanimal kingdom %d:\n\n", ++n)} 1' animals.txt
于 2012-11-14T19:43:45.987 回答