Quero escrever alguns textos predefinidos em um arquivo com o seguinte:
text="this is line one\n
this is line two\n
this is line three"
echo -e $text > filename
Estou esperando algo assim:
this is line one
this is line two
this is line three
Mas entendi:
this is line one
this is line two
this is line three
Tenho certeza de que não há espaço após cada um \n
, mas como sai o espaço extra?
text="this is line one\nthis is line two\nthis is line three"
a mesma linha? (sem entrar)\n
em cada linha, você já atingiu a nova linha para ir para a nova linha\n
. Então, por que você coloca a próxima linha em nova linha? Simplesmentetext="this is line one\nthis is line two\nthis is line three"
\n
final de cada linha faz com que a saída seja executada em conjunto em uma única linha."$text"
linha de eco é crucial. Sem eles, nenhuma das novas linhas (literais e '\ n') funciona. Com eles, todos eles fazem.Respostas:
O Heredoc parece mais conveniente para esse fim. É usado para enviar vários comandos para um programa interpretador de comandos como ex ou cat
A sequência depois
<<
indica onde parar.Para enviar essas linhas para um arquivo, use:
Você também pode armazenar essas linhas em uma variável:
Isso armazena as linhas na variável denominada
VAR
.Ao imprimir, lembre-se das aspas ao redor da variável, caso contrário você não verá os caracteres de nova linha.
Ainda melhor, você pode usar o recuo para destacar mais o seu código. Desta vez, basta adicionar um
-
depois<<
para impedir que as guias apareçam.Mas você deve usar tabulações, não espaços, para o recuo no seu código.
fonte
-d
opção inread -r -d '' VARIABLE <<- EOM
não funcionou para mim.Se você está tentando inserir a string em uma variável, outra maneira fácil é algo como isto:
Se você recuar sua cadeia de caracteres com tabulações (ou seja, '\ t'), a indentação será removida. Se você recuar com espaços, o recuo será deixado em.
NOTA: é significativo que o último parêntese de fechamento é em outra linha. O
END
texto deve aparecer em uma linha por si só.fonte
)
a mesma linha. Eu acho que é porque o que vai entre$(
e)
será executado em seu próprio universo, e o comando real não verá ')' de qualquer maneira. Gostaria de saber se funciona para outros também.echo
adiciona espaços entre os argumentos passados para ele.$text
está sujeito a expansão variável e divisão de palavras, portanto, seuecho
comando é equivalente a:Você pode ver que um espaço será adicionado antes de "this". Você pode remover os caracteres da nova linha e citar
$text
para preservar as novas linhas:Ou você pode usar
printf
, que é mais robusto e portátil do queecho
:Em
bash
, que suporta expansão de chaves, você pode até fazer:fonte
em um script bash, o seguinte funciona:
alternativamente:
nome do arquivo cat fornece:
fonte
-e
opçãoecho
. Por favor, tente novamente.Encontrei mais soluções desde que queria que cada linha fosse recuada corretamente:
Você pode usar
echo
:Não funciona se você colocar um
"\n"
pouco antes\
no final de uma linha.Como alternativa, você pode usar
printf
para uma melhor portabilidade (eu tive muitos problemas comecho
):Ainda outra solução pode ser:
ou
Outra solução é alcançada misturando
printf
esed
.Não é fácil refatorar o código formatado dessa maneira, pois você codifica o nível de indentação no código.
É possível usar uma função auxiliar e alguns truques de substituição de variáveis:
fonte
A seguir, é minha maneira preferida de atribuir uma string de várias linhas a uma variável (acho legal).
O número de sublinhados é o mesmo (aqui 80) nos dois casos.
fonte
Apenas para mencionar uma concatenação de uma linha simples, pois às vezes pode ser útil.
Você terá algo parecido com isto
Todos os espaços em branco iniciais e finais serão preservados
fonte
Existem várias maneiras de fazer isso. Para mim, canalizar a string recuada para o sed funciona muito bem.
Esta resposta foi baseada na resposta de Mateusz Piotrowski , mas refinou um pouco.
fonte
funcionará se você o colocar como abaixo:
fonte