Como deletar linhas específicas de um arquivo usando sed

Em certas ocasiões, precisamos deletar uma linha específica de um arquivo ou vários, por exemplo, aconteceu comigo que eu tinha uma lista completa de arquivos e preciso deletar a linha # 27 de todos eles (a linha # 27 é que de uma ACL, norma, regra, configuração), posso editar arquivo por arquivo ou posso apenas conseguir o que preciso usando o comando sede e um script bash (opcional).

Mas, vamos tentar um único arquivo um tanto simples.

Nós temos o arquivo distros-deb.txt que contém este:

debian

kubuntu

archlinux

solos

hortelã

Ou seja, o arquivo distros-deb.txt é onde colocaremos as distros baseadas em Debian, mas lá vemos que na linha # 3 há "archlinux", uma distro que obviamente não tem nada a ver com o Debian, então devemos eliminar essa linha. Para eliminar a linha nº 3 desse arquivo, colocaremos o seguinte:

sed "3d" distros-deb.txt > distros-deb-ok.txt

Explicar esta linha é um tanto fácil, com sede "3d" estamos indicando que excluiremos a linha # 3, com distros-deb.txt Indicamos em qual arquivo trabalhar, ou seja, deletar a linha # 3 deste arquivo, até aqui se pressionarmos Enter ele nos mostrará o que queremos mas no terminal, então com > distros-deb-ok.txt estamos indicando que ao invés de mostrar o resultado no terminal, que o coloque em um arquivo com este nome.

O que é simples?

Além disso, podemos evitar o uso do > distros-deb-ok.txt usando um parâmetro adequado de sede, o parâmetro -i

Ou seja, caso desejemos deletar a linha do arquivo e salvá-la com o mesmo nome (e não em outro arquivo), basta adicionar o parâmetro -i :

sed -i "3d" distros-deb.txt

Isso removerá a linha 3 de distros-deb.txt e salvará.

E se eu quiser um intervalo de linhas, ou seja, para remover a linha nº 3, mas também as linhas 4 e 5? Para isso, colocamos o intervalo de 3 a 5, ou seja:

sed -i "3,5d" distros-deb.txt

E vai me mostrar apenas debian e kubuntu 😀

E se eu quiser excluir da linha 2 até a última, quando não sei o total de linhas?

Basta usar o símbolo do dólar - »$

sed -i "2,$d" distros-deb.txt

Caso você queira eliminar da primeira linha para a # 4, simplesmente colocamos o valor 1 no início:

sed -i "1,4d" distros-deb.txt

Isso tem sido tudo, uma dica muito útil quando você quer fazer scripts bash para automatizar tarefas e precisa modificar e eliminar linhas de arquivos de configuração, para modificar podemos usar sede o perl, assim como eliminar já sabemos fazer com sed 😉

lembranças


O conteúdo do artigo segue nossos princípios de Ética editorial. Para relatar um erro, clique Clique aqui.

16 comentários, deixe o seu

Deixe um comentário

Seu endereço de email não será publicado.

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   mss-devel dito

    Muito boa contribuição 😉

    1.    KZKG ^ Gaara dito

      Obrigado

      A propósito, recebemos seu e-mail agora mesmo eu respondo 😀

      lembranças

  2.   sem nome dito

    Como sumo sacerdote do terminal, servidores e conexões ssh, venho até você, que bom KZKG ^ Gaara, e pergunto: onde posso obter um tutorial no nível da minha ignorância que me permite usar conexões ssh entre duas máquinas remotas em redes diferentes para compartilhar arquivos de texto, pdf, imagem e som (mp3)….

    🙂

    Sério, você poderia me orientar nesse sentido, eu tenho duas máquinas, uma no trabalho e outra em casa e preciso de uma conexão ssh entre elas (porque, pelo que entendi, ssh permite que conteúdo seja compartilhado entre máquinas, certo?).
    E se eu estiver errado, qual aplicativo você recomenda?
    E onde encontro um tutorial básico a esse respeito?

    1.    -spyker- dito

      scp

      scp user @ machine_address: path user @ machine_address: path.

      Mesma sintaxe que cp, origem -> destino.

  3.   F3niX dito

    Você apareceu cara, você estava perdido.

  4.   Joaquin dito

    Boa dica!

  5.   LycusHacker Emo dito

    Dica interessante ... xD

    Você conhece algum que destaque o texto em negrito?
    Quer dizer, eu tenho um arquivo txt que é um dicionário, tem mais de 10000 linhas e quero destacar determinado texto antes dos pontos de suspensão ":" e fazer isso um por um é demais.

    1.    KZKG ^ Gaara dito

      Olá,

      Um arquivo txt é um texto simples, como o nome indica ... simples, sem formatos ou algo semelhante, desculpe, mas acho que o que você pergunta não pode ser feito, pode? 🙁

      lembranças

      1.    aca dito

        na verdade, pode, mas você precisa saber o formato de destino.
        educaçao Fisica:
        echo $ (echo "Robert: Olá. Mude aqui" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        é uma questão de enfrentamento.
        a outra maneira de deletar que pode ser usada é sed '/' $ 1 '/ d', mas você tem que ter certeza de onde está.

        1.    LycusHacker Emo dito

          em seguida, termine de salvá-lo em * .odt

          Não existe uma maneira mais fácil de fazer isso com o LibreOffice?

  6.   Lolo dito

    Você poderia deletar parte de uma linha e deixar o resto?

    Digamos que eu queira excluir tudo na frente de uma palavra em uma determinada linha.

    Ou exclua tudo o que segue essa palavra.

    1.    aca dito

      Sim, é uma questão de puxar um regex (se necessário man sed -r, -regexp-extended)
      Começando pelo que eu acho
      echo «Robert: Olá. Mude aqui »| sed 's / Alterar //'
      com um padrão bem definido e com. (um caractere) e * (mais de um)
      Depois:
      echo «Robert: Olá. Mude aqui »| sed 's / Change. * //'
      Antes de:
      echo «Robert: Olá. Mude aqui »| sed 's /. * Alterar //'
      Se importa que a palavra apareça
      echo «Robert: Olá. Mude aqui »| sed 's / Change. * / Change /'
      ou mais elaborado
      na linha contendo Robert o que vem depois da Mudança
      echo -e «Fritz: Olá. Mude aqui \ nRobert: Olá. Mude aqui »| sed '/Robert/s/Cambio.*//'
      ou como no início, retire a segunda linha e processe o resto
      echo -e «Fritz: Olá. Mude aqui \ nRobert: Olá. Mude aqui \ nOutros »| sed -e 2d -e 's / Change. * //'
      echo -e «Fritz: Olá. Mude aqui \ nRobert: Olá. Mude aqui \ nOutros »| sed '2d; s / Change. * //'

      1.    Lolo dito

        Obrigado, é muito útil para mim.

  7.   msx dito

    Bom artigo, um dos que eu gosto, que bom o SysAdmin!
    O que seria a nossa vida sem sed, awek, perl, grep, tail, head, "Emacs" e tantas outras ferramentas essenciais!?

  8.   Lisbeth Ollarves dito

    Obrigado, foi muito útil.

  9.   Alfinetes dito

    Olá, e como você poderia deletar as linhas 1,4 e 10 de um arquivo no mesmo comando?

bool (verdadeiro)