Como fazer “incremental” substituir em arquivos com bash

0

Eu preciso pesquisar arquivos no diretório com um padrão específico (por exemplo foobar ) e substituí-los por foobarXXX , onde XXX é um número. Por exemplo, havia dois arquivos originais

snt130.txt

My mistress' eyes are nothing like foobar;
foobar is far more red than her lips' red;

snt18.txt

Shall I compare thee to a summer's day?
Thou art more lovely and more foobar:

Após o processamento, preciso de algo assim (a ordem dos números não importa, apenas a unicidade)

snt130.txt

My mistress' eyes are nothing like foobar001;
foobar002 is far more red than her lips' red;

snt18.txt

Shall I compare thee to a summer's day?
Thou art more lovely and more foobar003:

Qual é a maneira mais simples de realizar essa pesquisa e substituir a tarefa (de preferência com bash )

    
por Loom 03.11.2017 / 12:49

1 resposta

1

$ cat f1
My mistress' eyes are nothing like foobar;
foobar is far more red than her lips' red;
$ cat f2
Shall I compare thee to a summer's day?
Thou art more lovely and more foobar:

com perl

$ perl -i -pe 's/foobar\K/sprintf "%03d", ++$i/ge' f1 f2
$ cat f1
My mistress' eyes are nothing like foobar001;
foobar002 is far more red than her lips' red;
$ cat f2
Shall I compare thee to a summer's day?
Thou art more lovely and more foobar003:
  • o valor padrão da variável não inicializada é 0 no contexto numérico
  • e modifier permite usar o código Perl na seção de substituição
  • foobar\K string para substituir, \K usado apenas como uma conveniência aqui


Com gawk possuindo extensão inplace e assumindo apenas uma instância de string por linha

gawk -i inplace -v s='foobar' '$0 ~ s{sub(s, sprintf("%s%03d", s, ++i))} 1' f1 f2
    
por 03.11.2017 / 13:07