Como enviar quebra de linha com curl?

89

Tentei o seguinte para enviar uma quebra de linha com curl, mas \nnão é interpretada por curl.

curl -X PUT -d "my message\n" http://localhost:8000/hello

Como posso enviar uma quebra de linha com curl?

deamon
fonte
1
Em qual plataforma? Pode ser relevante
Pekka,

Respostas:

114

Às vezes, você deseja fornecer os dados a serem enviados literalmente.

A --data-binaryopção faz isso.

Szocske
fonte
2
Esta é a melhor forma de o fazer. A alternativa de usar -d @message.txtcomo sugerido na outra resposta em particular pode alterar suas quebras de linha. --data-binarypor 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/… )
William Denniss
8
Porque demorei um segundo: se você está enviando um arquivo, provavelmente vai querer usar um subshell para issocurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana
Interessante, mas qual é a vantagem?
Szocske
8
+1, resposta correta. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski,
3
Não consegui fazer o --data-binary funcionar, mas consegui usar a resposta do caractere% 0A (consulte @malcolmocean). Quando eu uso --data-binary "ip = 33.44.55. * \ N5.6.7.8" ele não o trata como nova linha, mas --data "" ip = 33.44.55. *% 0A5.6.7.8 "envia a nova linha
Paul
50

Seu shell está passando \seguido em nvez 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 \ne \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

Benjamin Atkin
fonte
Isso funcionou para mim também. Vou ter que brincar com isso, porque não funcionou com aspas duplas, o que significa que não posso usar aspas simples dentro da string.
Tyler Collier
1
Não sei de onde você tirou essa ideia de que essa é a "sintaxe do shell do JavaScript". O shell passa my message\nliteralmente, não com dois escapes, como você diz.
Chris Down
@ChrisDown, você me citou mal. Eu disse "sintaxe de string JavaScript", não "sintaxe shell JavaScript". Estou usando a sintaxe de string de JavaScript para deixar claro o que quero dizer com meus exemplos de string. Acho que você está se referindo como my message\né o mesmo que estou me referindo "my message\n".
Benjamin Atkin
2
@BenAtkin Desculpe, deslize freudiano. No entanto, minha leitura ainda estava correta. \nnão tem nada a ver com JavaScript. Na verdade, nada aqui tem nada a ver com JavaScript.
Chris Down
Estou usando para explicar às pessoas. E parece que funcionou. A sintaxe da string shell não é amplamente compreendida. Se fosse, por que essa pergunta teria sido feita? O que eu deveria ter usado para explicar isso?
Benjamin Atkin
16

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 .

Dave Kerr
fonte
Essa deve ser uma resposta aceita, apesar de usar a sintaxe Bash
odiszapc
Esta é a única coisa que funcionou para mim em todas as respostas
Bob Kocisko
15

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.

Jammer
fonte
Estou tendo problemas para entender isso. Eu entendo que @é para indicar um nome de arquivo, mas há algum significado especial ao usar @-? O que está <<EOFfazendo?
Dennis T - Restabelecer Monica -
1
@-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 EOFna carga útil de dados para informar ao bash que terminamos de gravar no fluxo.
Jammer de
Além disso, -é meio que a maneira padrão no GNU / Linux de especificar STDIN quando um nome de arquivo é esperado. Não é universal, mas é bastante comum.
Rich Remer
Consultando o manual, vemos que deve ser apenas - e não @ -
user3504575
8

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"
SutuwaShell
fonte
Muito obrigado ! Isso não está relacionado ao seu Mac: eu estava tendo exatamente o mesmo problema no Linux e usar o --data-binary @resolveu (enviar um arquivo .ics multilinha para um servidor CalDAV).
M-Jack
7

(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 é %0Acomo 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 messagepara o valor:

line one
another

você enviaria

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
MalcolmOcean
fonte
1
comentário secundário (talvez erro de digitação) para uma quebra de linha / caractere de retorno de caractere deve ser% 0A em vez de% A0
Paulo
3

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.

Pekka
fonte
Usar arquivos temporários é uma abordagem útil. De acordo com a resposta de Szocske, --data-binaryé uma alternativa mais fiel ao -d, pois enviará os dados na íntegra.
William Denniss
7
-1; Usar um arquivo temporário com -d @/path/to/temp/file.txtNÃO resolve o problema de quebra de linha. --data-binaryfaz, veja acima.
Frank Olschewski,
Se você está vendo isso porque está se perguntando por que seus comandos curl não funcionam depois de atualizar o curl ou atualizar para o Windows 10, certifique-se de adicionar aspas em torno da referência do arquivo. Por exemplo: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Meus scripts de reconstrução de elasticsearch pararam de funcionar.
joezen777
3

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
John Williams
fonte
-2

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\ntrabalhou no Gmail, mas \nfoi ignorado. Tentei dobrar a fuga e outras sugestões. Eu também tentei \r\ne 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": "[email protected]"}]}],"from": {"email": "[email protected]"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'

Eventualmente, desisti de procurar uma solução e mudei as tags text/plainpara text/htmle 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.

PJ Brunet
fonte