Postagem em destaque

Substituir somente a primeira ocorrência de uma determinada string

Manipular o conteúdo de um arquivo é uma prática comum em ambientes Unix-like e quando essa prática evolve em editar um grande número de linhas, o conhecimento do comando sed se torna imprescindível. Na maioria dos casos a utilização de um simples replace já resolveria o problema.

Exemplo:

$ sed 's/foo/bar/' arquivo

ou

$ sed 's/foo/bar/g' arquivo

Porém nem sempre as coisas são tão simples. Os exemplos anteriores substitui a expressão 'foo' por 'bar' em todas as linhas e o segundo recursivamente inclusive.

E se houver a necessidade de alterar somente a primeira ocorrência da expressão 'foo' por 'bar' ? E se tal expressão aparecer em linhas diferentes, impossibilitando a referência pelo número da linha ? A solução é criar uma regra adicional afim de garantir que somente a primeira expressão seja lida e substituída.

Considere o conteúdo do 'cores.txt' a seguir:

$ cat cores.txt 
branco
preto
vermelho
vermelho
verde
amarelo

Note que seu conteúdo é constituído por uma lista de cores, porém o 'vermelho' aparece duplicado. O objetivo é substituir somente a primeira ocorrência da palavra 'vermelho' por 'azul'.

Veja o que acontece se eu utilizar um dos exemplos anteriores:

$ sed 's/vermelho/azul/' cores.txt
branco
preto
azul
azul
verde
amarelo

Observe que a expressão 'vermelha' não existe mais, pois foi substituída por 'azul' em todas as linhas em que foi encontrada.

Regra adicional:

Para criação da regra vou precisa definir um label para controlar o fluxo do sed e dois comandos:

n - lê a próxima linha.
b - redireciona o fluxo para o label especificado.


Comando:



Na prática:

$ sed '/vermelho/{ s/vermelho/azul/;:a;n;ba }' cores.txt
branco
preto
azul
vermelho
verde
amarelo

Como planejado somente a primeira ocorrência da expressão 'vermelho' foi substituida.

Observações:

É necessário inserir o parâmetro '-i' após o comando 'sed' para que as alterações sejam realizadas no arquivo original. Certifique-se que o comando está correto antes de executá-lo ou utilize um sufixo em conjunto com o parâmetro '-i' para realizar um backup.

Exemplo:  sed -i.bkp ...

Comentários

Postar um comentário

Contato

Nome

E-mail *

Mensagem *