Curl ile satır sonu nasıl gönderilir?


91

Curl ile bir satır sonu göndermek için aşağıdakileri denedim, ancak curl ile \nyorumlanmadı.

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

Curl ile nasıl satır sonu gönderebilirim?


1
Hangi platformda? İlgili olabilir
Pekka

Yanıtlar:


114

Bazen verinin aynen gönderilmesini istersiniz.

--data-binarySeçenek bunu yapmaz.


2
Bunu yapmanın en iyi yolu budur. -d @message.txtDiğer cevapta önerildiği gibi kullanmanın alternatifi, özellikle satır sonlarınızı değiştirebilir. --data-binaryöte yandan olmayacak (çok parçalı / form verisi için CRLF satır
sonlarınızı

9
Çünkü bir curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
saniyemi

İlginç, ama avantajı nedir?
Szocske

8
+1, doğru cevap. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski

4
Çalışmak için --data-binary alamadım ama% 0A karakterini (bkz. @Malcolmocean) yanıtını kullanabildim. --Data-binary "ip = 33.44.55. * \ N5.6.7.8" kullandığımda, onu satırsonu olarak değerlendirmiyor, ancak --data "" ip = 33.44.55. *% 0A5.6.7.8 "yeni satırı gönderiyor
Paul

51

Sizin kabuk geçiyor \ardından nyerine kıvrılıp ziyade bir satır "my message\n". Bash, \nve gibi kaçış dizilerini destekleyen başka bir dize sözdizimi desteğine sahiptir \t. Kullanmak için dizeyi şununla başlatın ve dizeyi şu şekilde $'bitirin ':

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

Bkz ANSI-C aktaran içinde Bash


1
Bu benim için de çalıştı. Bununla uğraşmam gerekecek, çünkü çift tırnaklarla çalışmıyordu, bu da dize içinde tek tırnak kullanamayacağım anlamına geliyor.
Tyler Collier

1
Bunun "JavaScript kabuk sözdizimi" olduğu fikrini nereden edindiğinizi bilmiyorum. Kabuk my message\n, söylediğiniz gibi iki kaçışla değil , kelimesi kelimesine geçer .
Chris Down

@ChrisDown, beni yanlış anladın. "JavaScript kabuk sözdizimi" değil, "JavaScript dizesi sözdizimi" dedim. Dize örneklerimle ne demek istediğimi netleştirmek için JavaScript dize sözdizimi kullanıyorum. Sanırım bahsettiğiniz şey benim bahsettiğim my message\nşeyle aynı "my message\n".
Benjamin Atkin

2
@BenAtkin Üzgünüm, freudyen kayma. Ancak, okumam hala doğruydu. \nJavaScript ile ilgisi yoktur. Aslında buradaki hiçbir şeyin JavaScript ile hiçbir ilgisi yoktur.
Chris Down

Bunu insanlara anlatmak için kullanıyorum. Ve işe yaramış gibi görünüyor. Kabuk dizesi sözdizimi geniş çapta anlaşılmamıştır. Eğer öyleyse, bu soru neden sorulmuştu? Bunu açıklamak için ne kullanmalıydım?
Benjamin Atkin


15

Dosyaları kullanmak istemeyen ve kabuk kaçış sihrine başvurmak istemeyen biri için çözüm şudur:

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

Ancak bu, form alanlarında değil, gönderi veri yükündeki gerçek satırsonlarıdır.


Bunu anlamakta güçlük çekiyorum. Bunu @bir dosya adı belirtmek için anlıyorum , ancak kullanırken özel bir anlamı var @-mı? Ne <<EOFyapıyor
Dennis T --Reinstate Monica

1
@-curl'ye standart girişten gelen girdiyi tüketmesini söyler ve <<EOFbash için akış sonu göstergesidir. Daha sonra EOFveri yükündeki sihirli kelimeyi kullanarak bash'a akışa yazmayı bitirdiğimizi söyleriz.
Jammer

Ayrıca, -GNU / Linux'ta bir dosya adı beklendiğinde STDIN'i belirtmenin standart yoludur. Evrensel değil ama oldukça yaygındır.
Rich Remer

Manuel danışarak biz sadece olması gerektiğini bakınız - değil @ -
user3504575

8

(Buraya biraz farklı bir soruyla geldim, bu yüzden cevabımı göndereceğim çünkü gelecekteki kaşiflere yardımcı olabilir)

Çözümüm, form tarzı veriler, yani bir sorgu dizesindeki anahtar / değer çiftleri gönderen kişiler için geçerlidir. %0AKodlanmış bir alanın olduğu gibi kodlanmış satır sonunu kullanın %20. Diğer sembolleri dönüştürmek için http://meyerweb.com/eric/tools/dencoder/ kullanabilirsiniz .

Yani anahtarı messagedeğere ayarlamak istiyorsanız :

line one
another

gönderirdin

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello

1
küçük yorum (belki yazım hatası) bir satır sonu / hata dönüş karakteri için% A0 yerine% 0A olmalıdır
Paul

8

Benzer bir sorun vardı. Mac'ten bulut depolamaya csv dosyası yüklenirken yeni satırlar kaldırılıyordu. İndirdikten sonra, tüm dosya tek bir satır gibi görünüyordu. Başarısız olarak farklı EOL karakterleri '\ n' '\ r' '\ r \ n' eklemeyi denedim. '-D' yerine '--data-binary' kullanılması sorunu çözdü. Btw bu sorun yalnızca Mac'te meydana geldi. CentOS makinesinden çağrı yaparken '-d' gayet iyi çalıştı. Bu, Mac'in satırsonu karakterinden kaynaklanıyor gibi görünüyor. Ama artık hata ayıklamak istemeyin.

Yardımın için çok teşekkürler.

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"

Çok teşekkürler ! Bu, Mac'inizle ilgili değil: Linux'ta da aynı sorunu yaşıyordum ve kullanmak --data-binary @sorunumu çözdü (bir CalDAV sunucusuna çok satırlı bir .ics dosyası göndermek).
M-Jack

3

Sorunuza bir cevap değil, ancak mesajı ve satır sonunu içeren geçici bir dosya oluşturarak ve üzerinde çalışması için bu dosyayı curl vererek aşardım:

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

Gönderen manuel :

Verileri @ harfiyle başlatırsanız, geri kalanı verinin okunacağı bir dosya adı olmalıdır veya - curl'nin verileri stdin'den okumasını istiyorsanız. Dosyanın içeriği zaten URL olarak kodlanmış olmalıdır. Birden fazla dosya da belirtilebilir. Böylece 'foobar' adlı bir dosyadan veri göndermek --data @foobar ile yapılacaktır.


Geçici dosyaları kullanmak kullanışlı bir yaklaşımdır. Szocske'nin cevabına göre, veriyi kelimesi kelimesine göndereceği için --data-binarydaha sadık bir alternatiftir -d.
William Denniss

7
-1; İle geçici bir dosya kullanmak -d @/path/to/temp/file.txtsatır sonu sorununu çözmez. --data-binaryyukarı bakın.
Frank Olschewski

Bunu görüyorsanız, curl komutlarınızın neden curl'yi yükselttikten veya Windows 10'a yükselttikten sonra çalışmadığını merak ediyorsanız, dosya referansınızın etrafına tırnak işaretleri eklediğinizden emin olun. Örneğin: curl -X PUT -d "@ message.txt" localhost: 8000 / merhaba Elasticsearch yeniden oluşturma komut dosyalarım çalışmayı durdurdu.
joezen777

3

Çok kolay bir yol, ara vermek için konsolda sadece Shift-Enter tuşuna basın. Yazmak da çok okunaklı.

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

Server gets this: line1\nline2

Satır sonunu kaldırmak için şunu yapın:

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

Server gets this: line1 line2

-2

Sendgrid'i orijinal olarak https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html burada bulunan bu kodla (aşağıda kopyalanmıştır) kullanıyordum.

\n\nGmail'de çalıştı, ancak \ngöz ardı edildi. Kaçış ve diğer önerileri ikiye katlamaya çalıştım. Ben de denedim \r\nve bu da Gmail'de çalışmadı. Not: Diğer e-posta istemcilerini test etme zahmetine girmedim, belki Gmail'e özgü bir sorundu.

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

Sonunda bir çözüm aramaya vazgeçti ve anahtarlı text/plainiçin text/htmlve sadece kullanılan <br />etiketler.

Birisi Sendgrid'in, etkin bir izleme pikseliniz varsa düz metni HTML'ye dönüştürmesini önerdi, bu da mantıklı. Belki yeni satırlar düz metinden html'ye dönüştürme sürecinde yok edildi. Müşterinin bir izleme pikseli istediğini varsayıyorum, bu yüzden HTML'ye geçmeye karar verdim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.