Cadeia de várias linhas com espaço extra (recuo preservado)

Eu quero escrever alguns textos pré-definidos para um arquivo com o seguinte:

text="this is line one\n this is line two\n this is line three" echo -e $text > filename 

Eu estou esperando algo assim:

 this is line one this is line two this is line three 

Mas tenho isso:

 this is line one this is line two this is line three 

Tenho certeza de que não há espaço após cada \n , mas como o espaço extra sai?

Heredoc soa mais conveniente para esse propósito. Ele é usado para enviar vários comandos para um programa de intérprete de comando como ex ou cat

 cat << EndOfMessage This is line 1. This is line 2. Line 3. EndOfMessage 

A string após '<<' indica onde parar.

Para enviar essas linhas para um arquivo, use:

 cat > $FILE <<- EOM Line 1. Line 2. EOM 

Você também pode armazenar essas linhas para uma variável:

 read -r -d '' VAR << EOM This is line 1. This is line 2. Line 3. EOM 

Isso armazena as linhas para a variável chamada VAR .

Ao imprimir, lembre-se das aspas ao redor da variável, caso contrário você não verá os caracteres da nova linha.

 echo "$VAR" 

Melhor ainda, você pode usar o recuo para destacar mais em seu código. Desta vez, basta adicionar um '-' após '<<' para impedir que as guias apareçam.

 read -r -d '' VAR <<- EOM This is line 1. This is line 2. Line 3. EOM 

Mas você deve usar tabulações, não espaços, para recuo em seu código.

Se você está tentando colocar a string em uma variável, outra maneira fácil é algo assim:

 USAGE=$(cat <<-END This is line one. This is line two. This is line three. END ) 

Se você recuar sua string com tabulações (ou seja, '\ t'), o recuo será retirado. Se você recuar com espaços, o recuo será deixado.

NOTA: É significativo que o último parêntese de fechamento esteja em outra linha. O texto END deve aparecer em uma linha sozinho.

echo adiciona espaços entre os argumentos passados ​​para ele. $text está sujeito a expansão de variables ​​e divisão de palavras, então seu comando echo é equivalente a:

 echo -e "this" "is" "line" "one\n" "this" "is" "line" "two\n" ... 

Você pode ver que um espaço será adicionado antes de “this”. Você pode remover os caracteres de nova linha e citar $text para preservar as novas linhas:

 text="this is line one this is line two this is line three" echo "$text" > filename 

Ou você poderia usar o printf , que é mais robusto e portátil que o echo :

 printf "%s\n" "this is line one" "this is line two" "this is line three" > filename 

No bash , que suporta a expansão de chaves, você pode até fazer:

 printf "%s\n" "this is line "{one,two,three} > filename 

Em um script bash o seguinte funciona:

 #!/bin/sh text="this is line one\nthis is line two\nthis is line three" echo $text > filename 

alternativamente:

 text="this is line one this is line two this is line three" echo "$text" > filename 

cat filename dá:

 this is line one this is line two this is line three 

Eu encontrei mais soluções desde que eu queria ter cada linha corretamente indentada:

  1. Você pode usar o echo :

     echo "this is line one" \ "\n""this is line two" \ "\n""this is line three" \ > filename 

    Não funciona se você colocar "\n" logo antes \ no final de uma linha.

  2. Alternativamente, você pode usar o printf para melhor portabilidade (aconteceu de ter muitos problemas com o echo ):

     printf "%s\n" \ "this is line one" \ "this is line two" \ "this is line three" \ > filename 
  3. Ainda outra solução pode ser:

     text='' text="${text}this is line one\n" text="${text}this is line two\n" text="${text}this is line three\n" printf "%b" "$text" > filename 

    ou

     text='' text+="this is line one\n" text+="this is line two\n" text+="this is line three\n" printf "%b" "$text" > filename 
  4. É possível misturar printf e sed . Não é fácil refatorar código como esse, no entanto, à medida que você codifica o nível de recuo no código. Eu coloquei o exemplo em um bloco if para que haja algum recuo:

     if something then printf '%s' ' this is line one this is line two this is line three ' | sed '1d;$d;s/^ //g' fi 

A seguir é a minha maneira preferida para atribuir uma seqüência de várias linhas a uma variável (acho que parece bom).

 read -r -d '' my_variable << \ _______________________________________________________________________________ String1 String2 String3 ... StringN _______________________________________________________________________________ 

O número de sublinhados é o mesmo (aqui 80) em ambos os casos.

funcionará se você colocá-lo como abaixo:

 AA='first line \nsecond line \nthird line' echo $AA output: first line second line third line 
    Intereting Posts