Tentei o seguinte para enviar uma quebra de linha com curl, mas \n
não é interpretada por curl.
curl -X PUT -d "my message\n" http://localhost:8000/hello
Como posso enviar uma quebra de linha com curl?
Respostas:
Às vezes, você deseja fornecer os dados a serem enviados literalmente.
A --data-binary
opção faz isso.
-d @message.txt
como sugerido na outra resposta em particular pode alterar suas quebras de linha. --data-binary
por outro lado, não (o que é importante se você precisar manter as quebras de linha CRLF para multipart / form-data, consulte: stackoverflow.com/questions/10765243/… )
curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
curl --data-binary @/path/to/file.txt http://example.com/target
Seu shell está passando \
seguido em n
vez de uma nova linha para curl em vez de "my message\n"
. Bash tem suporte para uma outra sintaxe string que suporta seqüências de escape, como \n
e \t
. Para usá-lo, comece a string com $'
e termine-a com '
:
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Consulte ANSI-C Quoting no Bash Reference Manual
my message\n
literalmente, não com dois escapes, como você diz.
my message\n
é o mesmo que estou me referindo "my message\n"
.
\n
não tem nada a ver com JavaScript. Na verdade, nada aqui tem nada a ver com JavaScript.
Existe uma maneira muito mais fácil!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
Isso usará ANSI-C Quoting para inserir o caractere de nova linha.
Sem tubulação, sem arquivos de dados. Consulte também Enviando novas linhas com cURL .
A solução para quem não quer usar arquivos e não quer recorrer à magia de escape de shell é:
curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF
Mas isso é literalmente novas linhas na carga útil de dados de postagem, e não em campos de formulário.
@
é para indicar um nome de arquivo, mas há algum significado especial ao usar @-
? O que está <<EOF
fazendo?
@-
diz ao curl para consumir a entrada da entrada padrão e <<EOF
é o indicador de fim do fluxo para o bash. Em seguida, usamos a palavra mágica EOF
na carga útil de dados para informar ao bash que terminamos de gravar no fluxo.
-
é meio que a maneira padrão no GNU / Linux de especificar STDIN quando um nome de arquivo é esperado. Não é universal, mas é bastante comum.
Teve um problema semelhante. Durante o upload do arquivo csv do Mac para o armazenamento em nuvem, novas linhas foram sendo removidas. Depois de baixá-lo, todo o arquivo parecia uma única linha. Tentei adicionar diferentes caracteres EOL '\ n' '\ r' '\ r \ n' sem sucesso. Usar '--data-binary' em vez de '-d' resolveu o problema. Btw este problema ocorreu apenas no Mac. '-d' funcionou bem ao fazer a chamada da máquina CentOS. Isso se parece muito com o caractere de nova linha do Mac. Mas não quero mais depurar.
Muito obrigado por sua ajuda.
curl -X PUT -d @filename.csv https://cloudstorage -H "content-type: text/csv"
VS
curl -X PUT --data-binary @filename.csv https://cloudstorage -H "content-type: text/csv"
--data-binary @
resolveu (enviar um arquivo .ics multilinha para um servidor CalDAV).
(Acabei aqui com uma pergunta um pouco diferente, então só vou postar minha resposta porque pode ajudar futuros exploradores)
Minha solução se aplica a pessoas que estão enviando dados em estilo de formulário, ou seja, pares de chave / valor em uma string de consulta. Use a quebra de linha codificada, que é %0A
como um espaço codificado %20
. Você pode usar http://meyerweb.com/eric/tools/dencoder/ para converter outros símbolos.
Portanto, se você deseja definir a chave message
para o valor:
line one
another
você enviaria
curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
Não é uma resposta à sua pergunta, mas eu iria contorná-la criando um arquivo temporário contendo a mensagem e a quebra de linha e dando ao curl esse arquivo para trabalhar:
curl -X PUT -d @message.txt http://localhost:8000/hello
Do manual :
Se você iniciar os dados com a letra @, o resto deve ser um nome de arquivo de onde ler os dados, ou - se você quiser que o curl leia os dados de stdin. O conteúdo do arquivo já deve ser codificado por URL. Vários arquivos também podem ser especificados. A postagem de dados de um arquivo chamado 'foobar' seria, portanto, feita com --data @foobar.
--data-binary
é uma alternativa mais fiel ao -d
, pois enviará os dados na íntegra.
-d @/path/to/temp/file.txt
NÃO resolve o problema de quebra de linha. --data-binary
faz, veja acima.
Uma maneira muito fácil, apenas Shift-Enter no console para o intervalo. Muito legível digitando-o também.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
Faça isso para remover a quebra de linha:
curl -d "line1 \
line2" http-echo.com
Server gets this: line1 line2
Eu estava usando Sendgrid com este código (copiado abaixo) originalmente encontrado aqui https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
trabalhou no Gmail, mas \n
foi ignorado. Tentei dobrar a fuga e outras sugestões. Eu também tentei \r\n
e não funcionou no Gmail também. Nota: Não me preocupei em testar outros clientes de e-mail, talvez fosse um problema específico do Gmail.
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "your.email@example.com"}]}],"from": {"email": "example@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'
Eventualmente, desisti de procurar uma solução e mudei as tags text/plain
para text/html
e acabei de usar <br />
.
Alguém sugeriu que Sendgrid converta texto simples em HTML se você tiver um pixel de rastreamento habilitado, o que faz sentido. Talvez as novas linhas tenham sido destruídas no processo de conversão de texto simples em html. Presumo que o cliente deseja um pixel de rastreamento, então decidi mudar para HTML.