I've tried the following to send a line break with curl, but \n
is not interpreted by curl.
curl -X PUT -d "my message\n" http://localhost:8000/hello
How can I send a line break with curl?
I've tried the following to send a line break with curl, but \n
is not interpreted by curl.
curl -X PUT -d "my message\n" http://localhost:8000/hello
How can I send a line break with curl?
Sometimes you want to provide the data to be sent verbatim.
The --data-binary
option does that.
-d @message.txt
as suggested in the other answer in particular can alter your line breaks. --data-binary
on the other hand will not (which is important if you need to keep your CRLF linebreaks for multipart/form-data, see: #10765743) –
Duleba curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
–
Paraselene curl --data-binary @/path/to/file.txt http://example.com/target
–
Cordero --data-binary @/path/to/file.txt
, as suggested by @FrankOlschewski, does not work for me with curl 7.47.0 on x86_64 Linux. Using a subshell via "(<myfile)"
as suggested by @Paraselene to insert the multiline text into the command does work for me, however. –
Unaccountedfor curl -X POST -H "AuthToken: CF179AE4-3C99-45F5-A7CC-3284AA91CF67" http://localhost:8080/collector --data-binary @large.log -s
–
Prink Your shell is passing \
followed by n
rather than a newline to curl rather than "my message\n"
. Bash has support for another string syntax that supports escape sequences like \n
and \t
. To use it, start the string with $'
and end the string with '
:
curl -X PUT -d $'my message\n' http://localhost:8000/hello
See ANSI-C Quoting in the Bash Reference Manual
my message\n
verbatim, not with two escapes as you say. –
Skiver my message\n
is the same as what I'm referring to as "my message\n"
. –
Isthmus \n
has nothing to do with JavaScript. In fact nothing here has anything at all to do with JavaScript. –
Skiver There's a much easier way!
curl -X PUT -d $'my message\n' http://localhost:8000/hello
This will use ANSI-C Quoting to insert the newline character.
No piping, no data files. See also Sending Newlines with cURL.
The solution for someone who doesn't want to use files, and doesn't want to resort to shell escaping magic is:
curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF
But this is literal newlines in the post data payload, and not in form fields.
@
is to indicate a file name but is there some special meaning when using @-
? What is <<EOF
doing? –
Alongside @-
tells curl to consume input from standard in, and <<EOF
is the end of stream indicator for bash. We then later use the magic word EOF
in the data payload to tell bash that we are done writing to the stream. –
Ares -
is sort of the standard way in GNU/Linux to specify STDIN when a file name is expected. It's not universal, but it's pretty common. –
Prepossessing Had similar issue. While uploading a CSV file from Mac to cloud storage, new lines were being removed. After downloading it, the entire file looked like a single line. I tried adding different EOL characters \n
\r
\r\n
with no success. Using --data-binary
instead of -d
solved the issue.
Btw this issue occurred only from Mac. -d
worked just fine while making the call from CentOS machine. This very much looks like due to Mac's newline character. But don't feel like debugging any more.
Thanks a lot for your help.
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 @
has solved my issue (sending a multiline .ics file to a CalDAV server). –
Inside (I ended up here with a slightly different question, so I'm just going to post my answer because it might help future explorers)
My solution applies to people who are sending form-style data, i.e. key/value pairs in a query string. Use the encoded line break, which is %0A
, just like how an encoded space is %20
. You can use http://meyerweb.com/eric/tools/dencoder/ to convert other symbols.
So if you want to set the key message
to the value:
line one
another
you would send
curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
A very easy way, just Shift-Enter in the console for the break. Very readable typing it in too.
curl -d "line1
line2" http-echo.com
Server gets this: line1\nline2
Do this to remove the line break:
curl -d "line1 \
line2" http-echo.com
Server gets this: line1 line2
Not an answer to your question, but I would work around it by creating a temporary file containing the message and line break, and give curl that file to work on:
curl -X PUT -d @message.txt http://localhost:8000/hello
From the manual:
If you start the data with the letter @, the rest should be a file name to read the data from, or - if you want curl to read the data from stdin. The contents of the file must already be URL-encoded. Multiple files can also be specified. Posting data from a file named 'foobar' would thus be done with --data @foobar.
--data-binary
is a more faithful alternative to -d
, as it will send the data verbatim. –
Duleba -d @/path/to/temp/file.txt
does NOT solve the line-break problem. --data-binary
does, see above. –
Cordero I was using Sendgrid with this code (copied below) originally found here https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html
\n\n
worked in Gmail, but \n
was ignored. I tried to double the escape and other suggestions. I also tried \r\n
and that did not work in Gmail either. Note: I didn't bother to test other email clients, maybe it was a Gmail-specific problem.
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!"}]}'
Eventually I gave up looking for a solution and switched the text/plain
to text/html
and just used <br />
tags.
Someone suggested that Sendgrid converts plaintext to HTML if you have a tracking pixel enabled, which makes sense. Maybe the newlines were destroyed in the plaintext-to-html conversion process. I assume the client wants a tracking pixel, so decided to switch to HTML.
© 2022 - 2024 — McMap. All rights reserved.