He intentado lo siguiente para enviar un salto de línea con curl, pero curl \n
no lo interpreta.
curl -X PUT -d "my message\n" http://localhost:8000/hello
¿Cómo puedo enviar un salto de línea con curl?
Respuestas:
A veces desea proporcionar los datos que se enviarán literalmente.
La --data-binary
opción hace eso.
-d @message.txt
como se sugiere en la otra respuesta en particular puede alterar sus saltos de línea. --data-binary
por 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/… )
curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
curl --data-binary @/path/to/file.txt http://example.com/target
Su caparazón pasa \
seguido de en n
lugar 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 \n
y \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
my message\n
literalmente, no con dos escapes como dices.
my message\n
es lo mismo a lo que me refiero "my message\n"
.
\n
no tiene nada que ver con JavaScript. De hecho, nada aquí tiene nada que ver con JavaScript.
¡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 .
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.
@
es para indicar un nombre de archivo, pero ¿hay algún significado especial al usarlo @-
? Que esta <<EOF
haciendo
@-
le dice a curl que consuma la entrada de entrada estándar y <<EOF
es el indicador de fin de flujo para bash. Luego usamos la palabra mágica EOF
en la carga útil de datos para decirle a bash que hemos terminado de escribir en el flujo.
-
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.
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"
--data-binary @
resolvió mi problema (enviar un archivo .ics de varias líneas a un servidor CalDAV).
(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 %0A
igual que un espacio codificado %20
. Puede utilizar http://meyerweb.com/eric/tools/dencoder/ para convertir otros símbolos.
Entonces, si desea establecer la clave message
en el valor:
line one
another
enviarías
curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
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.
--data-binary
es una alternativa más fiel a -d
, ya que enviará los datos textualmente.
-d @/path/to/temp/file.txt
NO resuelve el problema de salto de línea. --data-binary
hace, ver arriba.
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
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\n
funcionó en Gmail, pero \n
fue ignorado. Traté de duplicar el escape y otras sugerencias. También lo intenté \r\n
y 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": "your.email@example.com"}]}],"from": {"email": "example@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'
Finalmente, dejé de buscar una solución y cambié text/plain
a text/html
y 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.