Як надіслати розрив рядка за допомогою завивки?


90

Я спробував наступне, щоб надіслати розрив рядка за допомогою curl, але \nне інтерпретується curl.

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

Як можна надіслати розрив рядка за допомогою curl?


1
На якій платформі? Може бути актуальним
Pekka

Відповіді:


114

Іноді ви хочете надати дані, що надсилаються дослівно.

--data-binaryВаріант робить це.


2
Це найкращий спосіб зробити це. Альтернатива використання, -d @message.txtяк пропонується в іншій відповіді, зокрема може змінити розриви рядків. --data-binaryз іншого боку , НЕ буде (що важливо , якщо ви хочете зберегти ваші CRLF переноси рядків для многочастного / форм-даних, див: stackoverflow.com/questions/10765243 / ... )
Вільям Denniss

8
Тому що це зайняло у мене секунду: якщо ви завантажуєте файл, ви, мабуть, захочете використовувати для цього під curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
оболонку

Цікаво, але в чому перевага?
Шоцке

8
+1, правильна відповідь. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski

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

Ваша оболонка передається \, nа не новий рядок, щоб згортати, а не "my message\n". Bash має підтримку іншого синтаксису рядків, який підтримує екрануючі послідовності, такі як \nі \t. Щоб використовувати його, запустіть рядок з $'і закінчіть рядок з ':

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

Див. Цитування ANSI-C у Довідковому посібнику Bash


1
Це спрацювало і у мене. Мені доведеться пограти з цим, оскільки він не працював з подвійними лапками, а це означає, що я не можу використовувати одинарні лапки всередині рядка.
Тайлер Коллер

1
Я не знаю, звідки у вас така ідея, що це "синтаксис оболонки JavaScript". Оболонка проходить my message\nдослівно, а не з двома втечами, як ви кажете.
Chris Down

@ChrisDown, ти неправильно цитував мене. Я сказав "синтаксис рядка JavaScript", а не "синтаксис оболонки JavaScript". Я використовую синтаксис рядків JavaScript, щоб зрозуміти, що я маю на увазі на своїх прикладах рядків. Я думаю, що ви маєте на увазі my message\nте саме, що і я "my message\n".
Бенджамін Аткін

2
@BenAtkin Вибачте, фрейдівський промах. Однак моє читання все-таки було правильним. \nне має нічого спільного з JavaScript. Насправді ніщо тут взагалі не має нічого спільного з JavaScript.
Кріс Даун,

Я використовую його для того, щоб пояснити людям. І, здається, це спрацювало. Синтаксис рядка оболонки широко не зрозумілий. Якби це було, чому б це питання було поставлене? Що я мав використати, щоб пояснити це?
Бенджамін Аткін

16

Є набагато простіший спосіб!

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

Для цього буде використано цитування ANSI-C, щоб вставити символ нового рядка.

Ні трубопроводів, ні файлів даних. Див. Також Надсилання нових рядків за допомогою cURL .


Це має бути прийнятою відповіддю, незважаючи на використання синтаксису Баша
odiszapc

Це єдине, що з усіх відповідей у ​​мене спрацювало
Боб Коціско

15

Рішення для тих, хто не хоче використовувати файли і не хоче вдаватися до магії, яка уникає оболонки, є:

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

Але це буквально нові рядки в корисному навантаженні даних, а не в полях форми.


У мене проблеми з розумінням цього. Я розумію, що @це означає ім’я файлу, але чи є якесь особливе значення при використанні @-? Що <<EOFробить?
Денніс Т - відновити Моніку -

1
@-вказує curl споживати вхідні дані із стандартного in, і <<EOFце індикатор кінця потоку для bash. Потім ми згодом використовуємо чарівне слово EOFв корисному наборі даних, щоб сказати bash, що ми закінчили писати в потік.
Jammer

Крім того, -це свого роду стандартний спосіб у GNU / Linux вказати STDIN, коли очікується ім'я файлу. Це не універсально, але досить часто.
Rich Remer

Переглянувши посібник, ми бачимо, що це має бути просто - а не @ -
user3504575

8

Був подібний випуск. Під час завантаження CSV-файлу з Mac на хмарне сховище нові рядки видалялися. Після завантаження весь файл виглядав як один рядок. Я спробував додати різні символи EOL '\ n' '\ r' '\ r \ n' без успіху. Проблема вирішена за допомогою '--data-binary' замість '-d'. До речі, ця проблема виникла лише у Mac. '-d' працював чудово під час дзвінка з машини CentOS. Це дуже схоже на символи нового рядка 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
незначний коментар (можливо, друкарська помилка) для символу розриву рядка / символу повернення carraige це має бути% 0A, а не% A0
Пол

3

Не відповідь на ваше запитання, але я б вирішив це, створивши тимчасовий файл, що містить повідомлення та розрив рядка, і дав би curl цей файл для роботи:

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

З посібника :

Якщо ви починаєте дані з літери @, решта має бути ім'ям файлу для читання даних, або - якщо ви хочете, щоб curl читав дані зі stdin. Вміст файлу повинен бути вже закодований за URL-адресою. Також можна вказати кілька файлів. Опублікування даних із файлу з назвою 'foobar', таким чином, здійснюється за допомогою --data @foobar.


Використання тимчасових файлів - зручний підхід. Відповідно до відповіді Шоцке, --data-binaryце більш вірна альтернатива -d, оскільки вона буде надсилати дані дослівно.
Вільям Денніс,

7
-1; Використання тимчасового файлу з -d @/path/to/temp/file.txtНЕ вирішує проблему розриву рядка. --data-binaryробить, див. вище.
Френк Ольшевський

Якщо ви бачите це, бо вам цікаво, чому ваші команди curl не працюють після оновлення curl або оновлення до Windows 10, обов’язково додайте лапки навколо посилання на файл. Наприклад: curl -X PUT -d "@ message.txt" localhost: 8000 / привіт Мої сценарії відновлення еластичного пошуку перестали працювати.
joezen777

3

Дуже простий спосіб, просто Shift-Enter на консолі для перерви. Дуже читабельно вводити його теж.

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

Я використовував Sendgrid із цим кодом (скопійований нижче), спочатку знайдений тут https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html

\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/plainдля text/htmlі тільки використовуваних <br />тегів.

Хтось запропонував Sendgrid перетворити відкритий текст у HTML, якщо у вас увімкнено піксель відстеження, що має сенс. Можливо, нові рядки були знищені в процесі перетворення відкритого тексту в html. Я припускаю, що клієнт хоче піксель відстеження, тому вирішив перейти на HTML.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.