AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1893127
Accepted
Michael Firth
Michael Firth
Asked: 2025-04-21 22:51:36 +0800 CST2025-04-21 22:51:36 +0800 CST 2025-04-21 22:51:36 +0800 CST

Como remover linhas em branco antes do padrão de correspondência de linhas no arquivo?

  • 772

Parece que isso é algo que deveria ter sido respondido aqui antes, mas minha busca ainda não encontrou o caso exato.

Tenho um arquivo (na verdade, um arquivo de hosts) com uma linha de sinalização. Tenho alguns scripts que adicionam e removem linhas antes da linha de sinalização.

Mas há o risco de que o processo de remoção deixe linhas em branco criadas pelo processo de adição.

Então, eu gostaria de um método para remover quaisquer linhas em branco imediatamente antes da linha de sinalização no arquivo.

Parece que isso deveria ser possível com sed, mas os exemplos online que encontrei não incluem esse caso (ironicamente, eles incluem o caso oposto - adicionar uma linha em branco antes de uma linha correspondente)

Existe uma maneira simples de fazer isso?

Não é necessário usar sed, qualquer outra ferramenta padrão de manipulação de texto também serviria.

É preferível editar no local, mas se realmente necessário, você pode copiar para um arquivo temporário e depois copiar de volta.

Entrada de amostra (não é possível postar os dados precisos)

10.8.7.6      static-host1
10.8.7.7      static-host2

10.8.8.5      static-host3
10.8.8.6      static-host4

# Start of dynamic section
10.9.9.8      dynamic-group1-host1
10.9.9.9      dynamic-group1-host1

10.9.8.7      dynamic-group2-host1
10.9.8.8      dynamic-group2-host2


# End of dynamic section

10.10.11.12   static-host5
10.10.11.13   static-host6

10.10.11.17   static-host7
10.10.11.18   static-host8

Saída de amostra

10.8.7.6      static-host1
10.8.7.7      static-host2

10.8.8.5      static-host3
10.8.8.6      static-host4

# Start of dynamic section
10.9.9.8      dynamic-group1-host1
10.9.9.9      dynamic-group1-host1

10.9.8.7      dynamic-group2-host1
10.9.8.8      dynamic-group2-host2
# End of dynamic section

10.10.11.12   static-host5
10.10.11.13   static-host6

10.10.11.17   static-host7
10.10.11.18   static-host8

Seria razoável para qualquer solução assumir que a última linha antes dos espaços em branco serem removidos sempre começa com o mesmo padrão, normalmente um endereço RFC1918 (por exemplo, 10. ou 192.168.)

Quanto ao outro comentário, sim, linhas em branco são desejáveis ​​para facilitar a leitura, e é por isso que meu script as adiciona entre as seções que ele adiciona. Ao remover uma seção, eu poderia remover "quaisquer linhas em branco antes da primeira linha da seção", mas isso se resume ao mesmo problema: remover uma ou mais linhas em branco antes de uma linha que corresponda a um padrão.

(espero que seja óbvio) não é aceitável simplesmente remover todas as linhas em branco do arquivo.

linux
  • 1 1 respostas
  • 52 Views

1 respostas

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2025-04-23T00:10:20+08:002025-04-23T00:10:20+08:00

    Solução

    sed '
       : load
       /^[[:space:]]*$/ {N; b load;}
       /\n# End of dynamic section$/ s/^[[:space:]]*//
    ' hosts
    

    Explicação

    O fragmento entre : loade b loadé um laço que acrescenta Nlinhas ( ) ao espaço de padrão, enquanto todo o espaço de padrão consiste em linhas "vazias": caracteres da spaceclasse de caracteres (na localidade POSIX, a spaceclasse de caracteres inclui exatamente <espaço>, <avanço de formulário>, <nova linha>, <retorno de carro>, <tabulação> e <tabulação vertical>; pode incluir mais caracteres na sua localidade). Quando houver um caractere que não pertença à spaceclasse de caracteres, o laço para de acrescentar linhas e o script prossegue.

    Em outras palavras, o script carrega linhas no espaço de padrões até que uma linha não "vazia" apareça ou a entrada termine. Então, o espaço de padrões é um trecho de zero ou mais linhas "vazias" seguidas por, no máximo, uma linha não "vazia".

    A linha de código com # End of dynamic sectionsubstitui ( s) as linhas "vazias" iniciais no espaço do padrão por nada, se e somente se a última linha carregada for exatamente # End of dynamic sectione não for a única linha carregada.

    Por fim, sedimprime o espaço do padrão resultante e inicia um novo ciclo (se ainda não estiver no final da entrada), pois esse é seu comportamento padrão.


    Notas

    • Se você quiser que o script detecte linhas realmente vazias , substitua cada uma [[:space]]por apenas \n. Alternativamente, faz sentido usar [ \t\n]or [[:blank:]\n](na localidade POSIX blankinclui exatamente <espaço> e <tab>, mas pode incluir mais caracteres na sua localidade). Escolha o que for mais adequado às suas necessidades.

    • Cada linha sendo exata # End of dynamic sectioné especial.

    • 2

relate perguntas

  • Como eu faria minha máquina Linux parecer que está executando o Windows?

  • Existe um equivalente a cd - para cp ou mv?

  • execute o contêiner do docker como root

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • Como alterar permanentemente Ctrl + C para Ctrl + K no CentOS 7?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Vickel O Firefox não permite mais colar no WhatsApp web? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve