我有一个小的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”匹配后增加一个?
答案 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