Gostaria de remover linhas vazias do início e do final do arquivo, mas não remover linhas vazias entre as linhas não vazias no meio. Eu acho sed
ou awk
seria a solução.
Fonte:
1:
2:
3:line1
4:
5:line2
6:
7:
8:
Resultado:
1:line1
2:
3:line2
Gostaria de remover linhas vazias do início e do final do arquivo, mas não remover linhas vazias entre as linhas não vazias no meio. Eu acho sed
ou awk
seria a solução.
Fonte:
1:
2:
3:line1
4:
5:line2
6:
7:
8:
Resultado:
1:line1
2:
3:line2
Tente isso,
Para remover linhas em branco do início de um arquivo:
Para remover linhas em branco do final de um arquivo:
Para remover linhas em branco do início e do fim de um arquivo:
Do homem sed ,
-e script, --expression=script -> adiciona o script aos comandos a serem executados
b rótulo -> Ramificar para rótulo; se o rótulo for omitido, ramifique para o final do script.
a -> Acrescentar texto após uma linha (sintaxe alternativa).
$ -> Corresponde à última linha.
n N -> Adicione uma nova linha ao espaço de padrão e, em seguida, anexe a próxima linha de entrada ao espaço de padrão. Se não houver mais entrada, o sed sai sem processar mais comandos.
Este pequeno programa awk irá remover linhas vazias no início de um arquivo:
Então, podemos combinar isso com
tac
as linhas reversas e obter:Roubando o truque de substituição de comando de @guillermo chamorro :
Se o arquivo for pequeno o suficiente para atender aos requisitos de memória:
-0777
para engolir o arquivo de entrada inteiro^\n+
uma ou mais novas linhas do início da string\n\K
para evitar a exclusão do caractere de nova linha da última linha não vazia\n+$
uma ou mais novas linhas no final da stringEu proponho isso:
Ele imprimirá todo o texto, exceto as linhas em branco de início e fim. Então, se estendermos o exemplo:
Ele irá produzir:
Usando Raku (anteriormente conhecido como Perl_6):
Se o arquivo for lido no Raku com
lines
, o uso inteligente datrim
função pode ser usado para limpar linhas em branco (ou seja, espaços em branco) no início e no final do arquivo:O arquivo de entrada é o mesmo usado pelo @schrodigerscatcuriosity (duas linhas em branco no início do arquivo, duas linhas em branco no final do arquivo). E se você só precisa limpar o início/fim do(s) arquivo(s), então
trim-leading
etrim-trailing
são seus amigos.Como alternativa, abaixo está uma tradução bastante direta do código Perl5 do @Sundeep, usando alguns recursos do Raku:
Para a tradução Perl5 para Raku: o arquivo é
slurp
-ed e oS///
operador de substituição não destrutivo do Raku é usado para retornar a string resultante . A alternância é realizada com o operador de alternância de||
'primeira correspondência' do Raku, já que o|
operador de alternância do Raku denota o Longest Token Matching (LTM, uma melhoria).O equivalente do Raku aos comandos
/k
e/ou/K
comandos do Perl5 é simplesmente<( ... )>
, usado isoladamente ou como um conjunto pareado. Esses operadores instruem o mecanismo regex a descartar quaisquer correspondências antes<(
ou depois)>
. [Observe, no entanto, que o\K
equivalente em Raku parece desnecessário para o problema em questão].https://raku.org
Uma abordagem simples de 2 passos apenas para completar:
O acima trata linhas de apenas caracteres em branco como vazias. Se, em vez disso, você deseja apenas que linhas sem caracteres sejam consideradas vazias, basta alterar
NF
para/./
.Expandindo em @schrodigerscatcuriosity comando-substituição-trick:
Acho que ainda há mais espaço para magias de conchas.
GNU sed não tem limite de comprimento de linha.
-z
flag diz ao editor para ler o texto até o delimitador de caractere NUL e, como não existe tal delimitador no arquivo, ele lê o arquivo inteiro como uma linha.Mas, por motivos de compatibilidade, é recomendável limitar o padrão e manter espaços não superiores a 4.000 bytes. Também:
Ed e Ex são editores POSIX que podem lidar com essa tarefa.
Eles são bastante semelhantes e nas soluções aqui apresentadas
ed
eex
são 100% intercambiáveis 1 .Solução geral
Se o arquivo for conhecido por ter linhas vazias no início e no final
Se você realmente quis dizer em branco 2 linhas
Explicação e divisão
O manual é sempre a melhor explicação, mas aqui está uma visão geral:
Ed e Ex sempre começam com a última linha selecionada - então, se tivéssemos de emitir um
d
comando sem adornos (delete), ele excluiria a última linha - e eles podem procurar linhas correspondentes a expressões regulares.Alguns comandos recebem endereços ("números de linha"), por exemplo,
3,6d
exclui das linhas 3 a 6./regex/
aguarda a primeira linha correspondente a "regex".?regex?
olha para trás para a primeira linha correspondente a "regex".Adivinha? Um regex também pode ser um endereço.
Por que precisamos adicionar temporariamente duas linhas vazias para a solução geral? Porque caso contrário
1,/./-1d
sempre excluiria a primeira linha e?.?+1,$d
a última, mesmo que não estivesse vazia.1: Mas no IIRC uma instalação limpa do Debian carece de Ed, então vou com o Ex.
2: Ou seja, linhas que estão visualmente vazias, mas podem conter espaços e tabulações.
comando
resultado