如何发送带有卷曲的换行符?


90

我尝试了以下方法来发送带有curl的换行符,但\n不能由curl解释。

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

如何发送带有卷曲的换行符?


1
在什么平台上?可能相关
Pekka 2010年

Answers:


114

有时您想提供要逐字发送的数据。

--data-binary选项可以做到这一点。


2
这是最好的方法。根据-d @message.txt其他答案的建议使用替代方法尤其可以更改换行符。--data-binary另一方面则不会(如果您需要为多部分/表单数据保留CRLF换行符,这一点很重要,请参阅:stackoverflow.com/questions/10765243/…
William Denniss,2012年

8
因为花了我一秒钟的时间:如果您要上传文件,则可能需要为此使用子curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
外壳

有趣,但是优点是什么?
Szocske 2012年

8
+1,正确答案。curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski 2013年

3
我无法使--data-binary工作,但能够使用%0A字符(请参阅@malcolmocean)答案。当我使用--data-binary“ ip = 33.44.55。* \ n5.6.7.8”时,它不会将其视为换行符,而是--data“” ip = 33.44.55。*%0A5.6.7.8 “不通过发送换行符
保罗

51

您的shell正在传递\n而不是通过换行符而不是进行卷曲"my message\n"。Bash支持另一种字符串语法,该语法支持转义序列,例如\n\t。要使用它,请以开头$'并以结束'

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

请参见《Bash参考手册》中的ANSI-C报价


1
这也对我有用。我将不得不使用它,因为它不能与双引号一起使用,这意味着我不能在字符串中使用单引号。
Tyler Collier

1
我不知道这是“ JavaScript shell语法”的意思。外壳my message\n逐字通过,而不是您所说的两次转义。
克里斯·

@ChrisDown,您给我的报价是错误的。我说的是“ JavaScript字符串语法”,而不是“ JavaScript Shell语法”。我正在使用JavaScript字符串语法来阐明我的字符串示例的含义。我认为您所指my message\n的与我所指的相同"my message\n"
本杰明·阿特金

2
@BenAtkin抱歉,弗洛里安滑倒。但是,我的阅读仍然正确。 \n与JavaScript无关。实际上,这里与JavaScript毫无关系。
克里斯·

我使用它是为了向人们解释它。它似乎奏效了。Shell字符串语法尚未得到广泛理解。如果是,为什么会问这个问题?我应该用什么来解释它?
本杰明·阿特金


15

对于不想使用文件并且不想诉诸于外壳转义魔术的人的解决方案是:

curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF

但这是邮政数据有效载荷中的字面换行符,而不是表单字段中的。


我很难理解这一点。我得到的@是指示文件名,但是使用时有一些特殊含义@-吗?在<<EOF做什么
丹尼斯T-恢复莫妮卡

1
@-告诉curl使用标准输入,并且<<EOF是bash流指示器的结尾。然后,我们稍后EOF在数据有效载荷中使用魔术字告诉bash我们已经完成了向流的写入。
贾默2015年

同样,这-是GNU / Linux中在需要文件名时指定STDIN的一种标准方式。它不是通用的,但很普遍。
Rich Remer

通过查阅手册,我们发现它应该只是-而不是@
user3504575

8

有类似的问题。从Mac将csv文件上传到云存储时,新行已被删除。下载后,整个文件看起来像一行。我尝试添加其他EOL字符'\ n''\ r''\ r \ n'失败。使用'--data-binary'而不是'-d'解决了该问题。顺便说一句,此问题仅发生在Mac上。从CentOS机器拨打电话时,“-d”工作正常。由于Mac的换行符,这看起来非常像。但是不要再进行调试了。

非常感谢你的帮助。

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"

非常感谢 !这与您的Mac无关:我在Linux上遇到了完全相同的问题,并且使用--data-binary @解决了我的问题(将多行.ics文件发送到CalDAV服务器)。
M-Jack,

7

(我在这里最后提出了一个稍微不同的问题,所以我只想发布我的答案,因为它可能对将来的探索者有所帮助)

我的解决方案适用于发送表单样式数据(即查询字符串中的键/值对)的人员。使用编码的换行符,%0A就像编码的空间一样%20。您可以使用http://meyerweb.com/eric/tools/dencoder/转换其他符号。

因此,如果要将键设置message为值:

line one
another

你会发送

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello

1
换行符/换行符的次要注释(可能是拼写错误),应为%0A而不是%A0
Paul Paul

3

不是您问题的答案,但是我会通过创建一个包含消息和换行符的临时文件来解决该问题,并卷曲该文件以进行处理:

curl -X PUT -d @message.txt http://localhost:8000/hello

手册

如果以字母@开头的数据,则其余的应该是从中读取数据的文件名,或者-如果希望curl从stdin中读取数据。该文件的内容必须已经被URL编码。也可以指定多个文件。因此,将使用--data @foobar从名为“ foobar”的文件中发布数据。


使用临时文件是一种方便的方法。根据Szocske的回答,它--data-binary是的更忠实替代品-d,因为它将逐字发送数据。
威廉·丹尼斯

7
-1; 使用带有的临时文件-d @/path/to/temp/file.txt不能解决换行问题。--data-binary确实,请参见上文。
Frank Olschewski 2013年

如果您由于想知道为什么在升级curl或升级到Windows 10后为什么curl命令不起作用而看到此信息,请确保在文件引用周围添加引号。例如:curl -X PUT -d“ @ message.txt” localhost:8000 / hello 我的Elasticsearch重建脚本已停止工作。
joezen777 '16

3

一种非常简单的方法,只需在控制台中按Shift键即可休息。也很容易输入。

curl -d "line1
line2" http-echo.com

Server gets this: line1\nline2

这样做删除换行符:

curl -d "line1 \
line2" http-echo.com

Server gets this: line1 line2

-2

我正在使用最初在此https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html找到的此代码(复制在下面)使用Sendgrid

\n\n在Gmail中工作,但\n被忽略了。我试图将越狱和其他建议加倍。我也尝试过\r\n,但在Gmail中也不起作用。注意:我不必费心测试其他电子邮件客户端,也许这是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!"}]}'

最终,我放弃了寻找解决方案,并切换text/plaintext/html和使用了<br />标签。

有人建议,如果启用了跟踪像素,Sendgrid会将纯文本转换为HTML,这很有意义。也许换行符在纯文本到html的转换过程中被破坏了。我假设客户端需要跟踪像素,因此决定切换到HTML。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.