Redirecionar o conteúdo sob uma nova linha (sem mais sintaxe ou argumentos)

3

Eu tentei estas maneiras para anexar conteúdo a um arquivo:

printf "\nsource ~/script.sh" >> /etc/bash.bashrc
echo -e "\nsource ~/script.sh" >> /etc/bash.bashrc
cat >> "/etc/bash.bashrc" <<< "source ~/script.sh"

Todas as três formas funcionam. Acho a cat herestring menos confortável, pois é necessário lê-la a partir do final (após cat anexar esse [end] a [start] ).

Por toda a parte, não se arrisca automaticamente e a sintaxe \n para printf e echo é uma que eu usaria pessoalmente como último recurso. Além disso, eu não conheço nenhuma maneira de adicionar uma nova linha para um heredring, e não encontrei tal forma nesta documentação .

O que eu procuro é um utilitário que desce uma linha automaticamente sem a necessidade de adicionar qualquer argumento ou sintaxe. Eu tentei ler em utilitários de processamento de texto nix, mas não encontrei nada parecido com o que eu procuro. Você conhece tal utilidade?

    
por user9303970 07.02.2018 / 10:31

3 respostas

4

Você não precisa escrever a linha cat "da maneira errada", isso funciona muito bem (embora, é claro, as setas na sequência aqui ainda apontem para uma direção ímpar):

$ cat <<< "some text" >> testfile
$ cat testfile
some text

Como mencionado nos comentários, a string here adiciona uma nova linha no final, enquanto que com printf e echo você usou \n na frente da string. echo normalmente adicionaria a nova linha final, assim como a string here, então se você precisa apenas disso, echo deve estar bem (mais é um embutido na maioria das camadas.)

Todos os seus comandos funcionam de forma ligeiramente diferente com as novas linhas

cat >> file <<< "string"        # newline at end
printf "\nstring" >> file       # newline at beginning
echo -e "\nstring" >> file      # newline at beginning and at the end

Francamente, acho que é melhor se acostumar com a notação \n , mas se você não gostar, sempre haverá aqui-docs (tanto as linhas iniciais quanto as seguintes:

cat >> file <<EOF

some text
EOF
    
por 07.02.2018 / 10:42
2

Se o arquivo terminar em uma nova linha, como todos os arquivos de texto POSIX corretos devem, não há necessidade de adicionar uma nova linha antes do texto adicionado ao arquivo.

Uma forma de garantir que um arquivo seja finalizado em uma nova linha é executar isso:

$ sed -i -e '$a\' file

Isso adicionará uma nova linha somente se o arquivo não tiver a nova linha.

Em seguida, você pode adicionar o texto necessário com uma nova linha à direita para garantir que o arquivo de texto ainda termine em uma nova linha:

a="source ~/script.sh"
echo  -e "$a" >> file    # with trailing new line
printf "$a\n" >> file    # with trailing new line
 <<< "$a" cat >> file    # with trailing new line

Observe que a ordem do comando cat foi alterada em relação à que você postou.

Se você precisar de uma nova linha principal adicional , use:

a="source ~/script.sh"
{ echo; echo  -e "$a" ; } >>file
echo -e "\n$a"            >>file
printf '%b' "\n$a\n"      >>file

a=$'\nsource ~/script.sh'
<<<"$a" cat >>file

Se você quiser uma nova linha com a opção cat, use:

a=$'\nsource ~/script.sh\n'
<<<"$a" cat >>file

que adicionará duas novas linhas à direita, uma da variável $a e uma (inevitável) da <<< (here-string).

    
por 07.02.2018 / 19:20
-1

Só porque é possível, aqui está uma maneira de fazer o comando append em python:

#!/usr/bin/env python
import sys
with open(sys.argv[2],"a") as f:
     f.write(sys.argv[1] + "\n")

E funciona assim.

$ echo "first line" > input.txt
$ ./append  "Hello Unix.se" input.txt
$ cat input.txt 
first line
Hello Unix.se
    
por 07.02.2018 / 10:48