Estou tentando adicionar texto ao final de uma linha nas primeiras x vezes que ela ocorre. Eu sei como fazer isso globalmente e para a ocorrência n. Não consigo descobrir como fazê-lo para as primeiras enésimas ocorrências. Um exemplo seria um arquivo text.txt que contém:
This is a test
junk
This is a test
More junk
This is a test
This is a test
This is a test
E, eu quero adicionar um '.' no final das três primeiras vezes que "Isto é um teste" ocorre. A saída que estou tentando obter é:
This is a test.
junk
This is a test.
More junk
This is a test.
This is a test
This is a test
This.*test
é o regex correto. O asterisco significa "0 ou mais vezes o caractere anterior", portantoThis*test
, não corresponderia a nenhuma de suas linhas.Agora, Sed é ruim em Aritmética. Para algo elegante, sugiro o Awk:
Acho que basta dizer que
c
, como qualquer variável não definida no Awk, é tratada como zero, mas me avise se precisar de mais esclarecimentos.Outra variante que evita fazer a correspondência regexp depois que todas as 3 ocorrências já foram encontradas:
Com
sed
especificamente, você poderia fazer algo como:Onde rastreamos o número de
.
s para anexar como número correspondente de.
s no espaço de retenção.Escusado será dizer que
sed
é muito menos apropriado para este tipo de tarefa. Se a razão para querersed
é a-i
extensão para edição in-loco encontrada em algumas implementações (emprestadas deperl
), observe que a implementação GNU deawk
também pode fazer isso com-i inplace
, ou você pode usar a coisa real:Se você quiser adicionar um
.
após cada ocorrência deThis is a test
em oposição a todas as linhas que contenham pelo menos uma ocorrência deThis is a test
,perl
também seria a melhor escolha:Com
perl
nós poderíamos fazer como mostradoOs elefantes também podem dançar, embora com passos simples. Usando
GNU sed
a escrita em seu modo regex estendido-E
, podemos armazenar a contagem como número de novas linhas na espera.