Eco nova linha e início de string \ t

1

Claro, echo -e pode ser usado para que \ n seja entendido como uma nova linha. O problema é quando quero repetir algo que começa com \ t, e. "\ test".

Então, digamos que eu queira executar echo -e "test\n\test" . Espero que isso seja produzido:

test
\test

Mas, em vez disso, produz:

test
  est

O \t está sendo interpretado como uma guia em vez de um literal \ t. Existe uma solução limpa para este problema?

    
por Zeruno 02.03.2017 / 23:50

3 respostas

2
echo -e "\t"

passa \t para echo porque a barra invertida é especial entre aspas duplas em bash . Ele serve como um operador escapando (citando). Em \ , ele escapa sozinho.

Você pode fazer:

echo -e "\\t"

para echo ser passado \t ( echo -e "\\t" também seria), ou você poderia usar aspas simples nas quais \ não é especial:

echo -e '\t'

Agora, echo é um comando muito pouco suportável . Mesmo em bash , seu comportamento pode depender do ambiente. Eu aconselharia evitá-lo e usar printf , com o qual você pode fazer:

printf 'test\n\test\n'

Ou até mesmo decidir quais partes passam por essas expansões de seqüência de escape:

printf 'test\n%s\n' '\test'

Ou:

printf '%b%s\n' 'test\n' '\test'

%b entende as mesmas seqüências de escape que echo (alguns echo s), enquanto o primeiro argumento para printf , o formato, também entende seqüências, mas de maneira ligeiramente diferente de echo ( mais parecido com o que é feito em outros idiomas). Em qualquer caso, \n é entendido por ambos.

    
por 03.03.2017 / 00:31
1

Isto não está de acordo com o manual para o comando, mas o próprio homem declara o ponto 1:

  1. O eco depende do seu casco (e há outras razões para evitá-lo, como tubulações).
  2. O comentário de Stéphane não é um mau caminho a percorrer: printf it.
  3. echo solution echo -e "a\na\ta" (aspas duplas, leia o que eles fazem se você quiser expandir esse código para algo mais) e testes:

'

➜  ~ echo -e a \n a \ta
a n a ta
➜  ~ echo -e "a \n a \ta"
a 
 a  a
➜  ~ echo -e "a\na\ta"   
a
a   a
➜  ~ bash                
T420s:~$ echo -e "a\na\ta"
a
a   a
T420s:~$ echo -e a\na\ta
anata
T420s:~$ echo a\na\ta
anata
T420s:~$ echo "a\na\ta"
a\na\ta
T420s:~$ 

O primeiro shell é o ZSH.

    
por 03.03.2017 / 00:14
0

O fragmento de shell "test\n\test" expande para a string test\n\test , porque uma barra invertida entre aspas duplas faz com que o próximo caractere seja interpretado literalmente se o próximo caractere for "$\' e caso contrário a barra invertida será interpretada literalmente. Em seguida, echo -e substitui \n por uma nova linha e \t por uma guia.

Evite aspas duplas para citar o texto literal. Use aspas simples: elas têm regras mais simples - tudo dentro de aspas simples é interpretado literalmente como uma aspa simples. Se você optar por usar aspas duplas, não use barras invertidas que não sejam seguidas por um caractere que ele citaria - se você quiser uma barra invertida entre aspas duplas, use \ .

echo -e 'test\n\test'
echo -e "test\n\\test"
    
por 03.03.2017 / 00:31