¿Cómo enviar un salto de línea con curl?

90

He intentado lo siguiente para enviar un salto de línea con curl, pero curl \nno lo interpreta.

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

¿Cómo puedo enviar un salto de línea con curl?

demonio
fuente
1
¿En qué plataforma? Puede ser relevante
Pekka

Respuestas:

114

A veces desea proporcionar los datos que se enviarán literalmente.

La --data-binaryopción hace eso.

Szocske
fuente
2
Esta es la mejor manera de hacerlo. La alternativa de usar -d @message.txtcomo se sugiere en la otra respuesta en particular puede alterar sus saltos de línea. --data-binarypor otro lado no lo hará (lo cual es importante si necesita mantener sus saltos de línea CRLF para multipart / form-data, consulte: stackoverflow.com/questions/10765243/… )
William Denniss
8
Porque me tomó un segundo: si está cargando un archivo, probablemente querrá usar una subcapa para estocurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana
Interesante, pero ¿cuál es la ventaja?
Szocske
8
+1, respuesta correcta. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski
3
No pude hacer que --data-binary funcionara, pero pude usar el carácter% 0A (ver @malcolmocean) como respuesta. Cuando uso --data-binary "ip = 33.44.55. * \ N5.6.7.8" no lo trata como una nueva línea, sino --data "" ip = 33.44.55. *% 0A5.6.7.8 "envía la nueva línea a través de
Paul
51

Su caparazón pasa \seguido de en nlugar de una nueva línea para curl en lugar de "my message\n". Bash tiene soporte para otra sintaxis de cadena que admite secuencias de escape como \ny \t. Para usarlo, comience la cadena con $'y termine la cadena con ':

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

Consulte las citas de ANSI-C en el Manual de referencia de Bash

Benjamin Atkin
fuente
1
Esto también funcionó para mí. Tendré que jugar con él, porque no funcionó con comillas dobles, lo que significa que no puedo usar comillas simples dentro de la cadena.
Tyler Collier
1
No sé de dónde sacaste esta idea de que esta es la "sintaxis de shell de JavaScript". La cáscara pasa my message\nliteralmente, no con dos escapes como dices.
Chris Down
@ChrisDown, me citaste mal. Dije "sintaxis de cadena de JavaScript", no "sintaxis de shell de JavaScript". Estoy usando la sintaxis de cadenas de JavaScript para tener claro lo que quiero decir con mis ejemplos de cadenas. Creo que a lo que te refieres my message\nes lo mismo a lo que me refiero "my message\n".
Benjamin Atkin
2
@BenAtkin Lo siento, desliz freudiano. Sin embargo, mi lectura seguía siendo correcta. \nno tiene nada que ver con JavaScript. De hecho, nada aquí tiene nada que ver con JavaScript.
Chris Down
Lo estoy usando para explicárselo a la gente. Y parece haber funcionado. La sintaxis de la cadena de shell no se comprende ampliamente. Si lo fuera, ¿por qué se habría hecho esta pregunta? ¿Qué debería haber usado para explicarlo?
Benjamin Atkin
16

¡Hay una forma mucho más sencilla!

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

Esto usará entre comillas ANSI-C para insertar el carácter de nueva línea.

Sin tuberías, sin archivos de datos. Consulte también Enviar nuevas líneas con cURL .

Dave Kerr
fuente
Esa debería ser una respuesta aceptada a pesar de usar la sintaxis Bash
odiszapc
Esto es lo único que me funcionó de todas las respuestas
Bob Kocisko
15

La solución para alguien que no quiere usar archivos y no quiere recurrir a la magia de escape de shell es:

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

Pero esto es literalmente nuevas líneas en la carga útil de datos de publicación, y no en los campos de formulario.

Jammer
fuente
Me cuesta entender esto. Entiendo que @es para indicar un nombre de archivo, pero ¿hay algún significado especial al usarlo @-? Que esta <<EOFhaciendo
Dennis T --Reintegro a Monica--
1
@-le dice a curl que consuma la entrada de entrada estándar y <<EOFes el indicador de fin de flujo para bash. Luego usamos la palabra mágica EOFen la carga útil de datos para decirle a bash que hemos terminado de escribir en el flujo.
Jammer
Además, -es una especie de forma estándar en GNU / Linux de especificar STDIN cuando se espera un nombre de archivo. No es universal, pero es bastante común.
Rich Remer
Al consultar el manual vemos que debería ser justo - y no @ -
user3504575
8

Tuvo un problema similar. Al cargar el archivo csv desde Mac al almacenamiento en la nube, se eliminaron nuevas líneas. Después de descargarlo, todo el archivo parecía una sola línea. Intenté agregar diferentes caracteres EOL '\ n' '\ r' '\ r \ n' sin éxito. El uso de '--data-binary' en lugar de '-d' resolvió el problema. Por cierto, este problema se produjo solo en Mac. '-d' funcionó bien mientras realizaba la llamada desde la máquina CentOS. Esto se parece mucho al carácter de nueva línea de Mac. Pero no tenga ganas de depurar más.

Muchas gracias por tu ayuda.

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
fuente
Muchas gracias ! Esto no está relacionado con su Mac: estaba teniendo exactamente el mismo problema en Linux, y el uso --data-binary @resolvió mi problema (enviar un archivo .ics de varias líneas a un servidor CalDAV).
M-Jack
7

(Terminé aquí con una pregunta ligeramente diferente, así que solo voy a publicar mi respuesta porque podría ayudar a futuros exploradores)

Mi solución se aplica a las personas que envían datos de estilo de formulario, es decir, pares clave / valor en una cadena de consulta. Utilice el salto de línea codificado, que es %0Aigual que un espacio codificado %20. Puede utilizar http://meyerweb.com/eric/tools/dencoder/ para convertir otros símbolos.

Entonces, si desea establecer la clave messageen el valor:

line one
another

enviarías

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
MalcolmOcean
fuente
1
comentario menor (tal vez error tipográfico) para un carácter de retorno de salto de línea / carraige debería ser% 0A en lugar de% A0
Paul
3

No es una respuesta a su pregunta, pero lo solucionaría creando un archivo temporal que contenga el mensaje y el salto de línea, y le daría a curl ese archivo para trabajar:

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

Del manual :

Si comienza los datos con la letra @, el resto debe ser un nombre de archivo para leer los datos, o - si desea que curl lea los datos de stdin. El contenido del archivo ya debe estar codificado en URL. También se pueden especificar varios archivos. Publicar datos de un archivo llamado 'foobar' se haría con --data @foobar.

Pekka
fuente
El uso de archivos temporales es un método útil. Según la respuesta de Szocske, --data-binaryes una alternativa más fiel a -d, ya que enviará los datos textualmente.
William Denniss
7
-1; Usar un archivo temporal con -d @/path/to/temp/file.txtNO resuelve el problema de salto de línea. --data-binaryhace, ver arriba.
Frank Olschewski
Si ve esto porque se pregunta por qué sus comandos de curl no funcionan después de actualizar curl o actualizar a Windows 10, asegúrese de agregar comillas alrededor de la referencia de su archivo. Por ejemplo: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Mis scripts de reconstrucción de elasticsearch habían dejado de funcionar.
joezen777
3

Una manera muy fácil, solo Shift-Enter en la consola para el descanso. Muy legible al escribirlo también.

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

Server gets this: line1\nline2

Haga esto para eliminar el salto de línea:

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

Server gets this: line1 line2
John Williams
fuente
-2

Estaba usando Sendgrid con este código (copiado a continuación) que se encuentra originalmente aquí https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html

\n\nfuncionó en Gmail, pero \nfue ignorado. Traté de duplicar el escape y otras sugerencias. También lo intenté \r\ny eso tampoco funcionó en Gmail. Nota: No me molesté en probar otros clientes de correo electrónico, tal vez fue un problema específico de 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!"}]}'

Finalmente, dejé de buscar una solución y cambié text/plaina text/htmly solo usé <br />etiquetas.

Alguien sugirió que Sendgrid convierta el texto sin formato a HTML si tiene habilitado un píxel de seguimiento, lo cual tiene sentido. Quizás las nuevas líneas se destruyeron en el proceso de conversión de texto sin formato a html. Supongo que el cliente quiere un píxel de seguimiento, así que decidió cambiar a HTML.

PJ Brunet
fuente