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

29

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

Tentei incluir uma nova linha "\ n" dentro da string:

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

mas dessa maneira nenhum arquivo com três linhas é criado, mas um arquivo com apenas uma linha e o conteúdo literal da sequência.

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

Abdul Al Hazred
fonte
stackoverflow.com/questions/8467424/…
Ciro Santilli deve ser executado em

Respostas:

30

Você solicitou o uso de alguma sintaxe com o echocomando:

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

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

A $'...'construção expande seqüências de escape ANSI incorporadas.

Janis
fonte
1
Observe que isso não é POSIX, se está disponível depende em grande parte do shell que você está usando.
Chris Baixo
1
Você encontra essa construção nas conchas proeminentes (pelo menos), ksh, bash, zsh (e talvez outras).
Janis
1
@ ChrisDown, ainda não é POSIX, mas está agendado para inclusão na edição 8. ksh93, bash, zsh, mksh, FreeBSD deve suportá-lo.
Stéphane Chazelas 22/02
24

O que o eco faz com escapes de caracteres é uma implementação definida. Em muitas implementações de eco (incluindo as mais modernas), a cadeia passada não é examinada em busca de escapes 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, realmente parece que você deseja printf, o que é mais legível aos meus olhos e mais portátil também (ele possui esse recurso definido pelo POSIX):

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

Você também pode considerar usar um documento aqui :

cat > file << 'EOF'
first line
second line
third line
EOF
Chris Down
fonte
Eu tentei o seu arquivo> cat << 'EOF' no shell, e quando eu apertei enter, recebi esse prompt em forma com cada linha, mas não consegui sair dele, mesmo pressionando ctrl + x ou ctrl + z
Abdul Al Hazred /
Você tem que digitar EOF sozinho em uma linha de entrada ...
Rmano
2
@mikeserv Você está sendo ridículo ou sério?
Matthew Leia
1
@AbdulAlHazred como o link na resposta indica, é chamado de "documento aqui" e é muito comum. A Wikipedia é boa sobre este tópico: en.wikipedia.org/wiki/Here_document .
David_thompson_085 22/03
1
Isso funcionou para o meu Mac OSX (especificamente echo -en 'text..', ao passo que a resposta aceita não reconheceu meu caractere de nova linha ( \n), o echo -enfez.
benjaminmgross
4

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

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

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

Ou

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

onde os parênteses agrupam os echocomandos em um subprocesso, que se 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

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

Consulte Quais são os operadores de controle e redirecionamento do shell? Para maiores informações.

Scott
fonte
2

Para dar mais uma opção, basta clicar Enter (uma nova linha literal):

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

Observe que você não digita o >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 comparação).

Gardenhead
fonte
0

O POSIX 7 diz que você não pode

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

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

Se o primeiro operando for -n ou se algum dos operandos contiver um caractere <slash>, os resultados serão definidos pela implementação.

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

Então use printf:

O operando de formato deve ser usado como a string de formato descrita em XBD File Format Notation [...]

a notação de formato de arquivo :

\ n <nova linha> Mova a posição de impressão para o início da próxima linha.

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

  • um Bash embutido: help echo
  • um executável independente: which echo

o que pode levar a alguma confusão.

Ciro Santilli adicionou uma nova foto
fonte
Haverá um echoembutido em cada shell disponível no sistema. No Ubuntu / bin / sh é geralmente traço, o bash também vem por padrão. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... todos terão seu próprio eco com comportamento diferente. Observe que which echonão fornecerá o caminho do eco do sistema em todos os shells.
Stéphane Chazelas 22/02
@ StéphaneChazelas "que eco não fornecerá o caminho do eco do sistema em todos os shells". Que eu não sabia, o que mais isso poderia dar?
Ciro Santilli escreveu
Tente em tcsh ou zsh. whichera originalmente (nos anos 80) um script csh apenas para usuários csh (carregava os aliases de ~ / .cshrc) e ainda está em alguns sistemas. whiché um builtin no zsh e no tcsh.
Stéphane Chazelas 22/02