カールで改行を送信する方法は?


90

curlで改行を送信するために次のことを試みましたが、curl\nによって解釈されません。

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

カールで改行を送信するにはどうすればよいですか?


1
どのプラットフォームで?関連する可能性があります
Pekka

回答:


114

逐語的に送信されるデータを提供したい場合があります。

--data-binaryオプションは、それを行います。


2
これが最善の方法です。-d @message.txt特に他の回答で提案されているように使用する代わりに、改行を変更することができます。--data-binary:(あなたがマルチパート/フォームデータのためのあなたのCRLFの改行を維持する必要がある場合に重要である、表示されません一方stackoverflow.com/questions/10765243/...
ウィリアム・Denniss

8
1秒かかったので:ファイルをアップロードする場合は、おそらくこれにサブシェルを使用することをお勧めしますcurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana 2012

興味深いですが、利点は何ですか?
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 "は改行を送信します
Paul

51

あなたのシェルを通過している\が続くnのではなく、カールするのではなく、改行"my message\n"。Bashは\n、やのようなエスケープシーケンスをサポートする別の文字列構文をサポートしています\t。これを使用するには、文字列をで開始し、文字$'列を':で終了します。

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

参照引用ANSI-Cバッシュ・リファレンス・マニュアル


1
これは私にとってもうまくいきました。二重引用符では機能しなかったため、文字列内で一重引用符を使用できないため、いろいろ試してみる必要があります。
タイラーコリアー2011

1
これが「JavaScriptシェル構文」であるというこの考えをどこで得たのかわかりません。あなたが言うように2つのエスケープmy message\nはなく、シェルは逐語的に通過します。
クリスダウン

@ChrisDown、あなたは私を誤って引用しました。「JavaScriptシェル構文」ではなく「JavaScript文字列構文」と言いました。私はJavaScriptの文字列構文を使用して、文字列の例の意味を明確にしています。あなたが言及しているものmy message\nは、私が言及しているものと同じだと思います"my message\n"
ベンジャミンアトキン2013年

2
@BenAtkin申し訳ありませんが、フロイト的失言。しかし、私の読みはまだ正しかった。 \nJavaScriptとは何の関係もありません。実際、ここではJavaScriptとは何の関係もありません。
クリスダウン

人々に説明するために使っています。そして、それはうまくいったようです。シェル文字列の構文は広く理解されていません。もしそうなら、なぜこの質問がされたのでしょうか?私はそれを説明するために何を使うべきでしたか?
ベンジャミンアトキン2013年

16

はるかに簡単な方法があります!

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

これは、ANSI-CQuotingを使用して改行文字を挿入します。

配管もデータファイルもありません。cURLを使用した改行の送信も参照してください。


Bash構文を使用しているにもかかわらず、それは受け入れられた答えであるはずです
odiszapc 2017

これは、すべての答えの中で私のために働いた唯一のことです
BobKocisko19年

15

ファイルを使用したくない、そしてシェルエスケープマジックに頼りたくない人のための解決策は次のとおりです。

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

ただし、これはポストデータペイロードの文字通りの改行であり、フォームフィールドではありません。


私はこれを理解するのに苦労しています。それ@はファイル名を示すことだと思いますが、使用するときに特別な意味はあり@-ますか?何し<<EOFてるの?
デニスT-モニカの復活

1
@-の標準からの入力を消費するようにcurlに<<EOF指示し、bashのストリーム終了インジケーターです。次にEOF、データペイロードのマジックワードを使用して、ストリームへの書き込みが完了したことをbashに通知します。
ジャマー

また、-ファイル名が必要なときにSTDINを指定するGNU / Linuxの標準的な方法の一種です。それは普遍的ではありませんが、かなり一般的です。
リッチリマー

マニュアルを参照することにより、我々はそれだけであることを見る-とない@ -
user3504575

8

同様の問題がありました。Macからクラウドストレージにcsvファイルをアップロードしているときに、新しい行が削除されていました。ダウンロードした後、ファイル全体が1行のように見えました。異なるEOL文字 '\ n' '\ r' '\ r \ n'を追加しようとしましたが、成功しませんでした。'-d'の代わりに '--data-binary'を使用すると、問題が解決しました。ところで、この問題は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-ジャック

7

(私はここで少し異なる質問に終わったので、将来の探検家に役立つかもしれないので、答えを投稿するつもりです)

私のソリューションは、フォームスタイルのデータ、つまりクエリ文字列のキーと値のペアを送信するユーザーに適用されます。%0Aエンコードされたスペースと同じように、エンコードされた改行を使用し%20ます。http://meyerweb.com/eric/tools/dencoder/を使用できますをして、他のシンボルを変換。

したがって、キーmessageを値に設定する場合は、次のようにします。

line one
another

あなたが送るだろう

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

1
改行/キャリッジリターン文字のマイナーコメント(おそらくタイプミス)は、%A0ではなく%0Aである必要があります
Paul

3

あなたの質問への答えではありませんが、メッセージと改行を含む一時ファイルを作成して回避し、そのファイルをcurlに与えて作業します。

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

マニュアルから:

データを文字@で始める場合、残りはデータを読み取るためのファイル名である必要があります。または、curlでstdinからデータを読み取る場合は-です。ファイルの内容はすでにURLエンコードされている必要があります。複数のファイルを指定することもできます。したがって、「foobar」という名前のファイルからのデータの投稿は、-data @ foobarを使用して行われます。


一時ファイルの使用は便利なアプローチです。Szocskeの回答によると、--data-binary-d、データを逐語的に送信するため、のより忠実な代替手段です。
ウィリアムデニス2012年

7
-1; で一時ファイルを使用しても、-d @/path/to/temp/file.txt改行の問題は解決されません。--data-binary上記を参照してください。
Frank Olschewski 2013

curlのアップグレードまたはWindows10へのアップグレード後にcurlコマンドが機能しない理由がわからないためにこれが表示される場合は、ファイル参照を引用符で囲んでください。次に例を示します。curl-XPUT-d "@ message.txt" localhost:8000 / helloelasticsearchの再構築スクリプトが機能しなくなりました。
joezen777 2016年

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\nGmailで動作しました\nが、無視されました。私はエスケープと他の提案を2倍にしようとしました。私も試し\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に切り替えることにしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.