Existe uma maneira de ecoar uma barra preta seguida de nova linha no bash?

3

Estou tentando encerrar uma linha com \ e ter outra coisa em uma nova linha. No começo eu fiz isso mas apenas imprime o \ n:

$ echo -e "Test\\nNewline" 
Test\nNewline

Eu tentei desta forma, mas adicione um espaço após a barra invertida:

$ echo -e "Test\ \nNewline"
Test\ 
Newline

Como posso fazer isso para que não haja espaço após o \ ?

UPDATE: Não há nenhum problema agora, pois vejo que adicionar mais duas barras obtém o resultado desejado. Mas ainda estou me perguntando por que isso acontece?

$ echo -e "Test\\\nNewline"
Test\
Newline
    
por InFlames 06.08.2015 / 20:20

2 respostas

2

Bash Reference Manual: Double Quotes: Within double quotes, backslashes that are followed by one of these characters [including backslash] are removed.

Portanto, "Test\\\nNewline" é substituído por Test\nNewline antes de ser passado como um parâmetro para o comando echo .

Para demonstrar isso:

$ echo -e "Test\\\nNewline"
Test\
Newline

$ echo -e 'Test\\nNewline'
Test\
Newline
    
por 06.08.2015 / 20:52
2

Steven já explicou por que tantas barras invertidas são necessárias; Eu gostaria de listar algumas maneiras possivelmente melhores para fazer a mesma coisa. Primeiro, usar aspas simples em vez de aspas duplas pula o nível extra de interpretação / remoção de escape:

$ echo -e "Test\\nNewline"
Test\nNewline
$ echo -e 'Test\\nNewline'
Test\
Newline
Em segundo lugar, eu recomendo contra usar echo para coisas como esta, já que diferentes versões se comportam de forma bem diferente: alguns interpretam seqüências de escape na string (como \n ) mesmo sem a opção -e , alguns imprima o "-e" como parte de sua saída, etc. Aqui está um exemplo usando / bin / echo em vez da versão integrada do bash:

$ /bin/echo -e 'Test\\nNewline'
-e Test\\nNewline

... Isso está no OS X v10.10.4; pode ser diferente no seu sistema operacional e / ou versão. Sempre que você quiser um comportamento previsível com a interpretação de escape e / ou deixar o avanço de linha final, recomendo printf em vez de echo . É um pouco mais complicado: o primeiro argumento para printf é uma string de formato, na qual os escapes são sempre interpretados, e isso também pode incluir % de sequências que serão usadas para adicionar argumentos restantes (nos quais as seqüências de escape não são interpretadas). Além disso, printf não adiciona automaticamente um feed de linha no final. Você precisa incluir isso explicitamente. Aqui estão algumas maneiras de imprimir o que você deseja com printf :

$ printf 'Test\\nNewline\n'    # note explicit final newline
Test\
Newline
$ printf '%s\n' 'Test\' 'Newline'    # Escape is interpreted in the format string, but not in the second argument
Test\
Newline
    
por 08.08.2015 / 19:43

Tags