Jak wysłać łamanie linii z zawijaniem?

90

Próbowałem wykonać następujące czynności, aby wysłać przerwanie linii z zawinięciem, ale \nnie jest interpretowane przez zawijanie.

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

Jak mogę wysłać łamanie linii z zawijaniem?

demon
źródło
1
Na jakiej platformie? Może mieć znaczenie
Pekka

Odpowiedzi:

114

Czasami chcesz podać dane do wysłania dosłownie.

Ta --data-binaryopcja to robi.

Szocske
źródło
2
To najlepszy sposób na zrobienie tego. Alternatywa użycia -d @message.txtsugerowana w szczególności w drugiej odpowiedzi może zmienić podziały wierszy. --data-binaryz drugiej strony nie (co jest ważne, jeśli chcesz zachować
podziały wierszy
8
Ponieważ zajęło mi to sekundę: jeśli przesyłasz plik, prawdopodobnie będziesz chciał użyć do tego podpowłokicurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana
Ciekawe, ale jaka jest zaleta?
Szocske
8
+1, poprawna odpowiedź. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski
3
Nie udało mi się uruchomić --data-binary, ale udało mi się użyć odpowiedzi znaku% 0A (patrz @malcolmocean). Kiedy używam --data-binary "ip = 33.44.55. * \ N5.6.7.8", nie traktuje go jako nowej linii, ale --data "" ip = 33.44.55. *% 0A5.6.7.8 „wysyła nową linię
Paul
51

Twoja skorupa przechodzi \następnie nzamiast nowej linii do zwijania zamiast "my message\n". Bash obsługuje inną składnię ciągu, która obsługuje sekwencje ucieczki, takie jak \ni \t. Aby go użyć, rozpocznij ciąg od $'i zakończ ciąg ':

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

Zobacz cytowanie ANSI-C w podręczniku Bash Reference Manual

Benjamin Atkin
źródło
1
U mnie też to zadziałało. Będę musiał się tym bawić, ponieważ nie działa z cudzysłowami podwójnymi, co oznacza, że ​​nie mogę używać apostrofów w ciągu.
Tyler Collier
1
Nie wiem, skąd wziął się pomysł, że jest to „składnia powłoki JavaScript”. Powłoka przechodzi my message\ndosłownie, a nie z dwoma ucieczkami, jak mówisz.
Chris Down,
@ChrisDown, źle mnie zacytowałeś. Powiedziałem „Składnia łańcuchów JavaScript”, a nie „Składnia powłoki JavaScript”. Używam składni ciągów JavaScript, aby wyjaśnić, co mam na myśli w przykładach ciągów. Myślę, że to, o czym mówisz, my message\njest tym samym, co ja nazywam "my message\n".
Benjamin Atkin
2
@BenAtkin Przepraszamy, poślizg freudian. Jednak mój odczyt był nadal poprawny. \nnie ma nic wspólnego z JavaScriptem. W rzeczywistości nic tutaj nie ma nic wspólnego z JavaScriptem.
Chris Down,
Używam go w celu wyjaśnienia ludziom. I wydaje się, że zadziałało. Składnia łańcucha powłoki nie jest szeroko rozumiana. Gdyby tak było, dlaczego zadawano by to pytanie? Jak powinienem był to wyjaśnić?
Benjamin Atkin
16

Jest o wiele łatwiejszy sposób!

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

Spowoduje to użycie cytowania ANSI-C do wstawienia znaku nowego wiersza.

Bez rurociągów, bez plików danych. Zobacz także Wysyłanie nowych linii z cURL .

Dave Kerr
źródło
Ta odpowiedź powinna być akceptowana pomimo użycia składni Bash
odiszapc
To jedyna rzecz, która zadziałała dla mnie ze wszystkich odpowiedzi
Bob Kocisko
15

Rozwiązaniem dla kogoś, kto nie chce używać plików i nie chce uciekać się do magii ucieczki powłoki, jest:

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

Ale to są dosłowne znaki nowej linii w ładunku danych post, a nie w polach formularza.

zakłócacz
źródło
Mam problem ze zrozumieniem tego. Rozumiem, że @ma to wskazywać nazwę pliku, ale czy ma jakieś specjalne znaczenie podczas używania @-? Co <<EOFrobisz?
Dennis T - Przywróć Monikę -
1
@-mówi curl, aby konsumował dane wejściowe ze standardu in i <<EOFjest wskaźnikiem końca strumienia dla bash. Następnie używamy magicznego słowa EOFw ładunku danych, aby powiedzieć bashowi, że skończyliśmy pisać do strumienia.
Jammer
Ponadto -w systemie GNU / Linux jest to standardowy sposób określania STDIN, gdy oczekiwana jest nazwa pliku. Nie jest uniwersalny, ale jest dość powszechny.
Rich Remer
Po zapoznaniu się z instrukcją widzimy, że powinien to być tylko - a nie @ -
użytkownik3504575
8

Miałem podobny problem. Podczas przesyłania pliku csv z komputera Mac do chmury usuwano nowe wiersze. Po pobraniu cały plik wyglądał jak jedna linia. Próbowałem dodać różne znaki EOL '\ n' '\ r' '\ r \ n' bez powodzenia. Użycie „--data-binary” zamiast „-d” rozwiązało problem. Przy okazji ten problem wystąpił tylko z komputerów Mac. „-d” działało dobrze podczas wykonywania połączenia z komputera CentOS. To bardzo wygląda ze względu na znak nowej linii Maca. Ale nie chcę już debugować.

Bardzo dziękuję za Twoją pomoc.

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
źródło
Wielkie dzięki ! Nie jest to związane z twoim komputerem Mac: miałem dokładnie ten sam problem w systemie Linux, a użycie --data-binary @rozwiązało mój problem (wysłanie pliku wielowierszowego .ics na serwer CalDAV).
M-Jack
7

(Skończyłem z nieco innym pytaniem, więc po prostu opublikuję swoją odpowiedź, ponieważ może to pomóc przyszłym odkrywcom)

Moje rozwiązanie dotyczy osób, które wysyłają dane w formie formularza, tj. Pary klucz / wartość w ciągu zapytania. Użyj zakodowanego podziału wiersza, czyli %0Atakiego samego, jak zakodowana spacja %20. Możesz użyć http://meyerweb.com/eric/tools/dencoder/, aby przekonwertować inne symbole.

Więc jeśli chcesz ustawić klucz messagena wartość:

line one
another

wysłałbyś

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello
MalcolmOcean
źródło
1
drobny komentarz (może literówka) dla znaku końca wiersza / powrotu znaku powinien to być% 0A zamiast% A0
Paul
3

Nie jest to odpowiedź na twoje pytanie, ale obejdę to, tworząc tymczasowy plik zawierający wiadomość i podział wiersza, i daję curlowi ten plik do pracy:

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

Z instrukcji :

Jeśli zaczynasz dane od litery @, reszta powinna być nazwą pliku, z którego dane będą odczytywane, lub - jeśli chcesz, aby curl odczytał dane ze stdin. Zawartość pliku musi być już zakodowana w formacie URL. Można również określić wiele plików. Wysyłanie danych z pliku o nazwie „foobar” odbywałoby się zatem za pomocą opcji --data @foobar.

Pekka
źródło
Korzystanie z plików tymczasowych jest wygodnym podejściem. Zgodnie z odpowiedzią Szocske, --data-binaryjest bardziej wierną alternatywą -d, ponieważ przesyła dane dosłownie.
William Denniss
7
-1; Użycie pliku tymczasowego w programie -d @/path/to/temp/file.txtNIE rozwiązuje problemu łamania linii. --data-binaryrobi, patrz wyżej.
Frank Olschewski
Jeśli widzisz to, ponieważ zastanawiasz się, dlaczego polecenia curl nie działają po uaktualnieniu curl lub uaktualnieniu do systemu Windows 10, upewnij się, że dodałeś cudzysłowy wokół odniesienia do pliku. Na przykład: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Moje skrypty do przebudowy funkcji Flexiblesearch przestały działać.
joezen777
3

Bardzo łatwy sposób, po prostu Shift-Enter w konsoli na przerwę. Bardzo czytelne wpisywanie.

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

Server gets this: line1\nline2

Zrób to, aby usunąć podział wiersza:

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

Server gets this: line1 line2
John Williams
źródło
-2

Używałem Sendgrid z tym kodem (skopiowanym poniżej) pierwotnie znalezionym tutaj https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html

\n\ndziałał w Gmailu, ale \nzostał zignorowany. Próbowałem podwoić ucieczkę i inne sugestie. Próbowałem też \r\ni to też nie działało w Gmailu. Uwaga: nie zawracałem sobie głowy testowaniem innych klientów poczty e-mail, być może był to problem związany z Gmailem.

    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!"}]}'

W końcu dałem się szuka rozwiązania i włączeniu text/plaindo text/htmli po prostu używane <br />tagi.

Ktoś zasugerował, że Sendgrid konwertuje zwykły tekst na HTML, jeśli masz włączony piksel śledzący, co ma sens. Być może znaki nowej linii zostały zniszczone w procesie konwersji zwykłego tekstu na HTML. Zakładam, że klient chce piksela śledzącego, więc zdecydował się przejść na HTML.

PJ Brunet
źródło