Como posso cortar o conteúdo de um arquivo de texto?

2

Eu quero remover todos os caracteres "em branco" desde o início e até o final de um arquivo de texto, incluindo \ n se existir. (basicamente imitando o comportamento da função trim () da maioria das linguagens de programação, se o "arquivo" for uma string grande).

    
por Lawrence 11.04.2018 / 17:31

6 respostas

1

Supondo que você queira remover todos espaços e novas linhas, não apenas a última nova linha, você pode usar tr :

tr -d '[[:space:]]' < file > file.trimmed

Ou, mais precisamente:

tr -d '\t\n ' < file > file.trimmed
    
por 11.04.2018 / 18:17
1

Em awk :

                 { isblank = 0 }
/^[[:blank:]]*$/ { isblank = 1 }

state == 0 &&  isblank { next }
state == 0 && !isblank { state = 1 }

state == 1 &&  isblank { buffer[++n] = $0 }
state == 1 && !isblank { for (i = 1; i <= n; ++i) print buffer[i]; n = 0; print }

state indica em que estado o programa se encontra. Quando state == 0 , o programa removerá qualquer linha em branco. Uma linha em branco é uma linha vazia ou que contém apenas espaços ou tabulações (que é o que corresponde a [[:blank:]] ). O programa permanece em state == 0 até que uma linha não vazia seja encontrada. Isso reduz o início do arquivo.

Quando state == 1 , o programa salvará linhas em branco na matriz buffer . Essas linhas em branco precisam ser exibidas assim que uma linha não vazia for encontrada. Se nenhuma linha não vazia for encontrada, elas serão descartadas (isso corta o final do arquivo).

O efeito geral é que as linhas em branco no início e no final do arquivo são removidas, enquanto as linhas em branco em outro lugar são preservadas (incluindo seus espaços ou tabulações, se contiverem estas no arquivo original).

Teste:

$ cat file



Three blank lines above


Two blank lines in the middle
Three blank lines below



$ awk -f trim.awk file
Three blank lines above


Two blank lines in the middle
Three blank lines below

O programa não modifica espaços em branco no início da primeira linha não vazia nem no final da última linha não vazia. Se isso for necessário, pode-se usar

$ awk -f trim.awk file | sed -e '1s/^[[:blank:]]*//' -e '$s/[[:blank:]]*$/'
    
por 11.04.2018 / 18:45
0

Supondo que você queira remover espaços em branco iniciais / finais para cada linha e não o arquivo como um todo.

Um arquivo de teste, em que algumas linhas têm espaços em branco à esquerda ou à direita e linhas em branco:

$ cat -e file
line 1$
  line 2$
line 3 has trailing spaces   $
$
blank line above$

E um comando GNU sed para fazer o recorte

$ sed -r 's/^\s+//; s/\s+$//; /^$/d' file | cat -e
line 1$
line 2$
line 3 has trailing spaces$
blank line above$
    
por 11.04.2018 / 18:24
0

Bem, não script shell, mas eu escrevi uma solução PHP:

nome do script: trimfile.php

<?php
if ( (!empty($argv[1])) && (file_exists($argv[1])) )  {
    $file_contents = file_get_contents($argv[1]);
    $new_file_contents = trim($file_contents) . "\n";
    if ($file_contents <> $new_file_contents) {
        file_put_contents($argv[1], $new_file_contents);
    }
}
?>

Uso:

$ php trimfile.php yourfile.txt
    
por 11.04.2018 / 17:49
0

Você pode tentar com o ed que infelizmente não veio na instalação padrão do debian.

printf '%s\n' \
 'g/[^[:blank:]][^[:blank:]]*/kx' \
 "'"'x,$j' \
 '$s/[[:blank:]]*$//' \
 '/[^[:blank:]][^[:blank:]]*/kx' \
 '1,'"'"'xj' \
 '1s/^[[:blank:]]*//' \
 'wq' | 
ed -s infile

Ou com o gnu sed

sed -Ezi 's/^\s+|\s+$//g;s/$/\n/' infile
    
por 11.04.2018 / 23:10
0

Use sed :

sed -z 's/^\s*//; s/\s*$//' infile
  • s/^\s*// , exclui espaços em branco / linhas vazias ao simples pedido do infile como arquivo de entrada.

  • s/\s*$// , espaços em branco excluídos / linhas vazias no final do infile como um arquivo de entrada, incluindo \n no final de infile .

Exemplo cat -e infile :

$
$
$
Three blank lines above$
$
$
Two blank lines in the middle$
a blank lines below$
$
a line with trailing whitespaces                $
          a line with leading whitespaces$
below are two empty lines + one whitespaces then an empty line again$
$
$
                                    $
$

A saída:

Three blank lines above


Two blank lines in the middle
a blank lines below

a line with trailing whitespaces
          a line with leading whitespaces
below are two empty lines + one whitespaces then an empty line again

Ou você pode usar printf para imprimir o resultado de sed que removeu os primeiros espaços em branco / linhas vazias e usou-o na substituição de comando que exclui linhas vazias apenas no final e \n .

printf '%s' "$(sed -z 's/^\s*//' infile)"
    
por 12.04.2018 / 17:46