Como colocar um caractere especial de nova linha em um arquivo usando o comando echo e o operador de redirecionamento?

27

Eu gostaria de criar um arquivo usando o comando echo e o operador de redirecionamento, o arquivo deve ser feito de algumas linhas.

Eu tentei incluir uma nova linha por "\ n" dentro da string:

echo "first line\nsecond line\nthirdline\n" > foo

mas desta forma não é criado nenhum arquivo com três linhas, mas um arquivo com apenas uma linha e o conteúdo textual da string.

Como posso criar usando apenas este comando um arquivo com várias linhas?

    
por Abdul Al Hazred 21.03.2015 / 23:56

5 respostas

26

Você solicitou o uso de alguma sintaxe com o comando echo :

echo $'first line\nsecond line\nthirdline' > foo

(Mas considere também a outra resposta que você recebeu.)

A construção $'...' expande as sequências de escape ANSI incorporadas.

    
por 22.03.2015 / 00:08
22

O que o echo faz com o personagem escapa é a implementação definida. Em muitas implementações de echo (incluindo as mais modernas), a string passada não é examinada para escape por padrão.

Com o eco fornecido pelo GNU bash (como um builtin) e algumas outras variantes de eco, você pode fazer algo como o seguinte:

echo -en 'first line\nsecond line\nthird line\n' > file

No entanto, parece que você realmente quer o printf , que é mais legível aos meus olhos, e mais portátil também (ele tem esse recurso definido pelo POSIX):

printf '%s\n' 'first line' 'second line' 'third line' > file

Você também pode considerar o uso de um documento aqui :

cat > file << 'EOF'
first line
second line
third line
EOF
    
por 22.03.2015 / 00:00
4

Aqui estão algumas outras maneiras de criar um arquivo de várias linhas usando o comando echo :

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

em que o segundo e o terceiro comandos usam o operador de redirecionamento >> , que faz com que a saída do comando seja anexada (adicionada) ao arquivo (que já deveria existir, até este ponto).

Ou

(echo "first line"; echo "second line"; echo "third line") > foo

onde os parênteses agrupam os comandos echo em um subprocesso, que parece e age como qualquer programa único que gera várias linhas (como ls , por exemplo).

Uma variação sutil acima é

{ echo "first line"; echo "second line"; echo "third line";} > foo

Isto é ligeiramente mais eficiente que a segunda resposta naquele não cria um subprocesso. No entanto, a sintaxe é um pouco mais complicada: Observe que você deve ter um espaço após o { e um ponto-e-vírgula antes do } .

Veja Quais são os operadores de controle e redirecionamento do shell? para obter mais informações.

    
por 22.03.2015 / 07:14
2

Para dar mais uma opção, você pode simplesmente pressionar Enter (ou seja, uma nova linha literal):

$ echo "the rain in spain
> falls mainly on the plain" > foo

Observe que você não digita > no início da segunda linha. Esse é o prompt do shell secundário, $PS2 , que o shell imprime quando você digita um comando incompleto (por exemplo, neste caso, um comando com um caractere de aspas sem correspondência).

    
por 24.01.2016 / 03:50
0

POSIX 7 diz que você não pode

link

-e não está definido e as barras invertidas são definidas pela implementação:

If the first operand is -n, or if any of the operands contain a <backslash> character, the results are implementation-defined.

a menos que você tenha uma extensão XSI opcional.

Portanto, use printf em vez disso:

format operand shall be used as the format string described in XBD File Format Notation [...]

a Notação de formato de arquivo :

\n <newline> Move the printing position to the start of the next line.

Lembre-se também que o Ubuntu 15.10 e a maioria das distribuições implementam echo como:

  • um Bash incorporado: help echo
  • um executável autônomo: which echo

que pode levar a alguma confusão.

    
por 24.01.2016 / 00:13