Como faço para remover o caractere de nova linha no final do arquivo?

18

Deixe-me esclarecer sobre o caractere de nova linha:

$ echo Hello > file1 ; cat file1
Hello
$ echo -n  Hello > file2 ; cat file2
Hello$ 

Aqui você pode ver que file1 tem caráter de nova linha no final, enquanto file2 não possui.

Agora, suponha que eu tenha um file :

$ cat file
Hello
Welcome to
Unix
$

E eu quero adicionar and Linux no final do arquivo, então echo " and Linux" >> file será adicionado à nova linha. Mas eu quero a última linha como Unix and Linux

Então, para contornar, eu quero remover o caractere de nova linha no final do arquivo. Portanto, como remover o caractere de nova linha no final do arquivo?

    
por Pandya 11.01.2016 / 15:56

3 respostas

18

Se tudo o que você quer fazer é adicionar texto à última linha, é muito fácil com o sed. Substitua $ (correspondência de padrão no final da linha) pelo texto que você deseja adicionar, somente nas linhas no intervalo $ (que significa a última linha).

sed '$ s/$/ and Linux/' <file >file.new &&
mv file.new file

que no Linux pode ser encurtado para

sed -i '$ s/$/ and Linux/' file

Se você quiser remover o último byte de um arquivo, o Linux (mais precisamente o GNU coreutils) oferece o truncate comando, o que torna isso muito fácil.

truncate -s -1 file

Uma maneira POSIX de fazer isso é com dd . Primeiro, determine o comprimento do arquivo e trunque-o para um byte a menos.

length=$(wc -c <file)
dd if=/dev/null of=file obs="$((length-1))" seek=1

Observe que ambos incondicionalmente truncam o último byte do arquivo. Você pode querer verificar se é uma nova linha primeiro:

length=$(wc -c <file)
if [ "$length" -ne 0 ] && [ -z "$(tail -c -1 <file)" ]; then
  # The file ends with a newline or null
  dd if=/dev/null of=file obs="$((length-1))" seek=1
fi
    
por 12.01.2016 / 01:20
8

No entanto, você pode remover o caractere de nova linha da linha por tr -d '\n' :

$ echo -e "Hello"
Hello
$ echo -e "Hello" | tr -d '\n'
Hello$

Você pode remover o caractere de nova linha no final do arquivo usando a seguinte maneira fácil:

  1. head -c -1 file

    De man head :

    -c, --bytes=[-]K
              print the first K bytes of each file; with the leading '-',
              print all but the last K bytes of each file
    
  2. truncate -s -1 file

    de man truncate :

    -s, --size=SIZE
              set or adjust the file size by SIZE
    

    SIZE is an integer and optional unit (example: 10M is 10*1024*1024).
    Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
    
    SIZE  may  also be prefixed by one of the following modifying characters: 
    '+' extend by, '-' reduce by, '<' at most, '>' at least, '/' round down to multiple of, '%' round up to multiple of.
    
por 11.01.2016 / 15:56
1

Aqui está uma maneira com sed - na última linha ( $ ) do arquivo, pesquise e substitua qualquer coisa e tudo ( .* ) por "o que você combinou" seguido por "e Linux":

sed '$s/\(.*\)/ and Linux/' file
    
por 11.01.2016 / 20:36