Comment envoyer un saut de ligne avec curl?

91

J'ai essayé ce qui suit pour envoyer un saut de ligne avec curl, mais \nn'est pas interprété par curl.

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

Comment puis-je envoyer un saut de ligne avec curl?

démon
la source
1
Sur quelle plateforme? Peut être pertinent
Pekka

Réponses:

114

Parfois, vous souhaitez fournir les données à envoyer textuellement.

L' --data-binaryoption fait cela.

Szocske
la source
2
C'est la meilleure façon de le faire. L'alternative d'utiliser -d @message.txtcomme suggéré dans l'autre réponse en particulier peut modifier vos sauts de ligne. --data-binaryd'autre part ne le sera pas (ce qui est important si vous devez conserver vos sauts de ligne CRLF pour multipart / form-data, voir: stackoverflow.com/questions/10765243/… )
William Denniss
9
Parce que cela m'a pris une seconde: si vous téléchargez un fichier, vous voudrez probablement utiliser un sous-shell pour celacurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana
Intéressant, mais quel est l'avantage?
Szocske
8
+1, bonne réponse. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski
4
Je n'ai pas pu faire fonctionner --data-binary mais j'ai pu utiliser la réponse du caractère% 0A (voir @malcolmocean). Lorsque j'utilise --data-binary "ip = 33.44.55. * \ N5.6.7.8" il ne le traite pas comme une nouvelle ligne, mais --data "" ip = 33.44.55. *% 0A5.6.7.8 "envoie la nouvelle ligne
Paul
51

Votre shell passe \suivi par nplutôt qu'une nouvelle ligne à boucler plutôt que "my message\n". Bash prend en charge une autre syntaxe de chaîne qui prend en charge les séquences d'échappement telles que \net \t. Pour l'utiliser, commencez la chaîne par $'et terminez la chaîne par ':

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

Voir Citations ANSI-C dans le manuel de référence de Bash

Benjamin Atkin
la source
1
Cela a fonctionné pour moi aussi. Je vais devoir jouer avec, car cela ne fonctionnait pas avec des guillemets doubles, ce qui signifie que je ne peux pas utiliser de guillemets simples dans la chaîne.
Tyler Collier du
1
Je ne sais pas d'où vous avez eu cette idée qu'il s'agit de "syntaxe du shell JavaScript". Le shell passe my message\nmot pour mot, pas avec deux échappements comme vous le dites.
Chris Down
@ChrisDown, vous m'avez mal cité. J'ai dit "syntaxe de chaîne JavaScript", pas "syntaxe de shell JavaScript". J'utilise la syntaxe de chaîne JavaScript pour être clair sur ce que je veux dire avec mes exemples de chaînes. Je pense que ce à quoi vous faites référence my message\nest le même que ce à quoi je fais référence "my message\n".
Benjamin Atkin
2
@BenAtkin Désolé, glissement freudien. Cependant, ma lecture était toujours correcte. \nn'a rien à voir avec JavaScript. En fait, rien ici n'a rien à voir avec JavaScript.
Chris Down
Je l'utilise pour l'expliquer aux gens. Et cela semble avoir fonctionné. La syntaxe des chaînes Shell n'est pas largement comprise. Si c'était le cas, pourquoi cette question aurait-elle été posée? Que devrais-je utiliser pour l'expliquer?
Benjamin Atkin
16

Il existe un moyen beaucoup plus simple!

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

Cela utilisera la citation ANSI-C pour insérer le caractère de nouvelle ligne.

Pas de tuyauterie, pas de fichiers de données. Voir aussi Envoi de nouvelles lignes avec cURL .

Dave Kerr
la source
Celui-ci devrait être une réponse acceptée malgré l'utilisation de la syntaxe Bash
odiszapc
C'est la seule chose qui a fonctionné pour moi parmi toutes les réponses
Bob Kocisko
15

La solution pour quelqu'un qui ne veut pas utiliser de fichiers et qui ne veut pas recourir à la magie échappant au shell est:

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

Mais il s'agit de retours à la ligne littéraux dans la charge utile des données de publication, et non dans les champs de formulaire.

Brouilleur
la source
J'ai du mal à comprendre cela. J'obtiens que @c'est pour indiquer un nom de fichier, mais y a-t-il une signification particulière lors de l'utilisation @-? Que <<EOFfais-tu?
Dennis T --Reinstate Monica--
1
@-dit à curl de consommer les entrées du standard in, et <<EOFest l'indicateur de fin de flux pour bash. Nous utilisons ensuite le mot magique EOFdans la charge utile de données pour dire à bash que nous avons fini d'écrire dans le flux.
Jammer
De plus, -c'est une sorte de méthode standard dans GNU / Linux pour spécifier STDIN lorsqu'un nom de fichier est attendu. Ce n'est pas universel, mais c'est assez courant.
Rich Remer
En consultant le manuel, nous voyons qu'il devrait être juste - et non @ -
user3504575
8

(Je me suis retrouvé ici avec une question légèrement différente, donc je vais juste poster ma réponse car cela pourrait aider les futurs explorateurs)

Ma solution s'applique aux personnes qui envoient des données de type formulaire, c'est-à-dire des paires clé / valeur dans une chaîne de requête. Utilisez le saut de ligne codé, qui %0Aressemble à la façon dont un espace codé est %20. Vous pouvez utiliser http://meyerweb.com/eric/tools/dencoder/ pour convertir d'autres symboles.

Donc, si vous souhaitez définir la clé messagesur la valeur:

line one
another

vous enverriez

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
MalcolmOcean
la source
1
commentaire mineur (peut-être une faute de frappe) pour un caractère de retour de saut de ligne / carraige, il devrait être% 0A plutôt que% A0
Paul
8

Eu un problème similaire. Lors du téléchargement du fichier csv du Mac vers le stockage en nuage, de nouvelles lignes ont été supprimées. Après l'avoir téléchargé, le fichier entier ressemblait à une seule ligne. J'ai essayé d'ajouter différents caractères EOL '\ n' '\ r' '\ r \ n' sans succès. L'utilisation de '--data-binary' au lieu de '-d' a résolu le problème. Btw ce problème s'est produit uniquement à partir de Mac. «-d» a très bien fonctionné lors de l'appel depuis la machine CentOS. Cela ressemble beaucoup au caractère de nouvelle ligne de Mac. Mais n'ayez plus envie de déboguer.

Merci beaucoup pour votre aide.

curl -X PUT -d @filename.csv https://cloudstorage -H "content-type: text/csv"

CONTRE

curl -X PUT --data-binary @filename.csv https://cloudstorage -H "content-type: text/csv"
SutuwaShell
la source
Merci beaucoup ! Ce n'est pas lié à votre Mac: j'avais exactement le même problème sous Linux, et l'utilisation --data-binary @a résolu mon problème (envoyer un fichier .ics multiligne à un serveur CalDAV).
M-Jack
3

Ce n'est pas une réponse à votre question, mais je la contournerais en créant un fichier temporaire contenant le message et le saut de ligne, et en donnant à curl ce fichier sur lequel travailler:

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

À partir du manuel :

Si vous commencez les données par la lettre @, le reste doit être un nom de fichier à partir duquel lire les données, ou - si vous voulez que curl lise les données depuis stdin. Le contenu du fichier doit déjà être encodé en URL. Plusieurs fichiers peuvent également être spécifiés. La publication de données à partir d'un fichier nommé 'foobar' se ferait donc avec --data @foobar.

Pekka
la source
L'utilisation de fichiers temporaires est une approche pratique. Selon la réponse de Szocske, --data-binaryest une alternative plus fidèle à -d, car elle enverra les données textuellement.
William Denniss
7
-1; L'utilisation d'un fichier temporaire avec -d @/path/to/temp/file.txtne résout PAS le problème de saut de ligne. --data-binaryfait, voir ci-dessus.
Frank Olschewski
Si vous voyez cela parce que vous vous demandez pourquoi vos commandes curl ne fonctionnent pas après la mise à niveau de curl ou la mise à niveau vers Windows 10, assurez-vous d'ajouter des guillemets autour de votre référence de fichier. Par exemple: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Mes scripts de reconstruction elasticsearch avaient cessé de fonctionner.
joezen777
3

Un moyen très simple, il suffit de Shift-Enter dans la console pour la pause. Très lisible en le tapant aussi.

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

Server gets this: line1\nline2

Faites ceci pour supprimer le saut de ligne:

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

Server gets this: line1 line2
John Williams
la source
-2

J'utilisais Sendgrid avec ce code (copié ci-dessous) trouvé à l'origine ici https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html

\n\na travaillé dans Gmail, mais a \nété ignoré. J'ai essayé de doubler l'évasion et d'autres suggestions. J'ai également essayé \r\net cela ne fonctionnait pas non plus dans Gmail. Remarque: je n'ai pas pris la peine de tester d'autres clients de messagerie, c'était peut-être un problème spécifique à 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!"}]}'

Finalement, j'ai abandonné la recherche d'une solution et j'ai basculé les balises text/plainà text/htmlet juste utilisé <br />.

Quelqu'un a suggéré que Sendgrid convertisse le texte brut en HTML si vous avez activé un pixel de suivi, ce qui est logique. Peut-être que les nouvelles lignes ont été détruites dans le processus de conversion du texte brut en html. Je suppose que le client veut un pixel de suivi, alors j'ai décidé de passer au HTML.

PJ Brunet
la source