Eu prefiro perl
para isso:
$ cat ip.txt
He drove his car to the cinema. He then went inside the cinema to purchase tickets, and afterwards discovered that it was more then two years since he last visited the cinema.
$ # forward counting is easy
$ perl -pe 's/\bcinema\b/$&.++$i/ge' ip.txt
He drove his car to the cinema1. He then went inside the cinema2 to purchase tickets, and afterwards discovered that it was more then two years since he last visited the cinema3.
-
\bcinema\b
palavra a procurar, usando limites de palavras para que não correspondam como parte parcial de outra palavra. Por exemplo, \bpar\b
não corresponde a apart
ou park
ou spar
-
ge
o g
flag é para substituição global. e
permite usar o código Perl na seção de substituição
-
$&.++$i
é concatenação de palavra correspondente e valor pré-incrementado de $i
, que possui valor padrão de 0
Por reverso, precisamos obter a contagem primeiro ...
$ c=$(grep -ow 'cinema' ip.txt | wc -l) perl -pe 's/\bcinema\b/$&.$ENV{c}--/ge' ip.txt
He drove his car to the cinema3. He then went inside the cinema2 to purchase tickets, and afterwards discovered that it was more then two years since he last visited the cinema1.
-
c
se torna variável de ambiente acessível através do hash %ENV
ou, com perl
sozinhos, fazendo slurping no arquivo inteiro
perl -0777 -pe '$c=()=/\bcinema\b/g; s//$&.$c--/ge' ip.txt