- Gerar link
- X
- Outros aplicativos
Postagem em destaque
- Gerar link
- X
- Outros aplicativos
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:
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:
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:
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:
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 ...
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
Showw, entendi a referencia!!!
ResponderExcluirEu que agradeço, sem tu esse post não existiria. kkkkkk
Excluir