Mengapa ini ditandai sebagai korban penipuan? Pertanyaan ini tentang melepas kereta kembali. Pertanyaan duplikat yang dituduhkan yang ditautkannya adalah tentang menghapus spasi, dan hanya secara tidak sengaja menyebutkan carriage return.
Michael Scheper
1
@MichaelScheper setuju dan membuka kembali.
fedorqui 'JADI berhenti melukai'
Istilahnya di sini aneh. Karakter penghentian baris Unix \n(hex 0x0A) disebut umpan kebohongan (LF); ini berbeda dari karakter carriage return (CR) \r(hex 0x0D) yang digunakan pada Windows dan di banyak protokol jaringan sebagai byte pertama dalam urutan akhir baris dua byte CR LF.
Ini adalah cara untuk menghapus linefeed dari variabel di BASH. Jawaban lain tidak perlu meminta proses TR ekstra. BTW, ini memiliki manfaat tambahan untuk menghilangkan spasi akhir!
ingyhere
1
Perhatikan bahwa itu juga menghapus spasi internal dari string juga ... COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n ']}|"mengembalikan|REBOOT|
Alex Jordan
2
@AlexJordan Ya, ini adalah fitur yang diinginkan : Anda dapat menggunakan spasi setelahnya \nuntuk mencegah: COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n']}|"akan kembali |RE BOOT|.
F. Hauri
2
Bagaimana pola tersebut bekerja ${COMMAND//[$'\t\r\n']}? Saya pikir ${COMMAND//[\t\r\n]}hanya akan berhasil, tetapi ternyata tidak. Untuk apa $simbol dan tanda kutip tunggal juga?
haridsv
1
Mengenai sintaks $ '', itulah kutipan ANSI C (disebutkan dalam jawaban wjordans).
chuckx
81
echo "|$COMMAND|"|tr '\n'' '
akan mengganti baris baru (di POSIX / Unix ini bukan carriage return) dengan spasi.
Sejujurnya saya akan berpikir untuk beralih dari pesta ke sesuatu yang lebih waras. Atau menghindari pembuatan data yang salah format ini sejak awal.
Hmmm, sepertinya ini bisa menjadi lubang keamanan yang mengerikan juga, tergantung dari mana datanya berasal.
Tanggalnya berasal dari permintaan curl yang ada di server yang sama, Bagaimana saya akan memasukkannya ke dalam var baru? newvar = $ (echo "| $ COMMAND |" | tr '\ n' '')
Matt Leyland
2
Iya. Tapi tolong beritahu saya Anda tidak mengizinkan orang sembarangan untuk me-reboot server Anda dari jarak jauh tanpa kata sandi ...
Robin Green
31
Mengapa Anda tidak menggunakan tr -d '\n'untuk menjatuhkan bukannya diganti dengan spasi
F. Hauri
3
Tolong cambuk pipa yang tidak berguna! Gunakan tr '\n' ' ' <<< "|$COMMAND|"sebagai penggantiecho ... | ...
F. Hauri
12
@ F. Hauri: atau tr berguna:"|${COMMAND//$'\n'}|"
rici
75
Bersihkan variabel Anda dengan menghapus semua carriage return:
Bukankah itu strip feeds? Bukankah seharusnya demikian tr -d '\r'?
Izzy
3
Menggema variabel yang tidak diberi komentar akan menghapus semua karakter IFS (baris baru, spasi, tab secara default). Jadi jika Anda akan melakukan ini, Anda harus sadar bahwa semua karakter IFS dihapus, dan Anda tidak memerlukan ekstensi tr. Cukup COMMAND=$(echo $COMMAND)akan memberikan efek yang serupa. Artinya, mungkin, iblis bertelur karena memanggil proses baru, tetapi masih cukup singkat dan manis untuk mata manusia dan jika Anda memiliki satu atau dua detik tersisa dalam hidup Anda, Anda mungkin bersedia menerima pukulan :-).
Mike S
Saya telah memperbarui pertanyaan menjadi "linefeed", karena contohnya memang menunjukkan bahwa itu adalah linefeed, bukan carriage return. Jawaban ini masih benar, tetapi mungkin harus diperbarui menjadi "linefeed" daripada "carriage return"?
Benjamin W.
8
Menggunakan bash:
echo "|${COMMAND/$'\n'}|"
(Perhatikan bahwa karakter kontrol dalam pertanyaan ini adalah 'baris baru' ( \n), bukan carriage return ( \r); yang terakhir akan memiliki keluaran REBOOT|pada satu baris.)
The pola diperluas untuk menghasilkan pola seperti dalam ekspansi nama file. Parameter diperluas dan kecocokan terpanjang pola terhadap nilainya diganti dengan string . [...] Jika string adalah nol, kecocokan pola dihapus dan pola / berikut dapat dihilangkan.
Juga menggunakan konstruksi $''kutipan ANSI-C untuk menentukan baris baru sebagai $'\n'. Menggunakan baris baru secara langsung juga akan berhasil, meski kurang cantik:
Menambahkan jawaban untuk menunjukkan contoh pengupasan beberapa karakter termasuk \ r menggunakan tr dan menggunakan sed. Dan mengilustrasikan menggunakan hexdump.
Dalam kasus saya, saya telah menemukan bahwa perintah yang diakhiri dengan awk print dari item terakhir |awk '{print $2}'di baris termasuk carriage-return \ r serta tanda kutip.
Saya biasa sed 's/["\n\r]//g'menanggalkan carriage-return dan kutipan.
Saya juga bisa menggunakan tr -d '"\r\n'.
Menarik untuk diperhatikan sed -zdiperlukan jika seseorang ingin menghapus \ n karakter line-feed.
\n
(hex 0x0A) disebut umpan kebohongan (LF); ini berbeda dari karakter carriage return (CR)\r
(hex 0x0D) yang digunakan pada Windows dan di banyak protokol jaringan sebagai byte pertama dalam urutan akhir baris dua byte CR LF.Jawaban:
Dibawah pesta, ada beberapa bashisme:
The
tr
perintah dapat digantikan oleh//
bashism :Lihat Perluasan Parameter dan QUOTING di halaman manual bash:
Lebih lanjut...
Seperti yang diminta oleh @AlexJordan, ini akan menyembunyikan semua karakter yang ditentukan. Jadi bagaimana jika
$COMMAND
memang mengandung spasi ...Segera:
catatan: pestamemiliki
extglob
opsi untuk diaktifkan (shopt -s extglob
) untuk menggunakan*(...)
sintaks.sumber
COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n ']}|"
mengembalikan|REBOOT|
\n
untuk mencegah:COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n']}|"
akan kembali|RE BOOT|
.${COMMAND//[$'\t\r\n']}
? Saya pikir${COMMAND//[\t\r\n]}
hanya akan berhasil, tetapi ternyata tidak. Untuk apa$
simbol dan tanda kutip tunggal juga?akan mengganti baris baru (di POSIX / Unix ini bukan carriage return) dengan spasi.
Sejujurnya saya akan berpikir untuk beralih dari pesta ke sesuatu yang lebih waras. Atau menghindari pembuatan data yang salah format ini sejak awal.
Hmmm, sepertinya ini bisa menjadi lubang keamanan yang mengerikan juga, tergantung dari mana datanya berasal.
sumber
tr -d '\n'
untuk menjatuhkan bukannya diganti dengan spasitr '\n' ' ' <<< "|$COMMAND|"
sebagai penggantiecho ... | ...
"|${COMMAND//$'\n'}|"
Bersihkan variabel Anda dengan menghapus semua carriage return:
sumber
tr -d '\r'
?tr
. CukupCOMMAND=$(echo $COMMAND)
akan memberikan efek yang serupa. Artinya, mungkin, iblis bertelur karena memanggil proses baru, tetapi masih cukup singkat dan manis untuk mata manusia dan jika Anda memiliki satu atau dua detik tersisa dalam hidup Anda, Anda mungkin bersedia menerima pukulan :-).Menggunakan
bash
:(Perhatikan bahwa karakter kontrol dalam pertanyaan ini adalah 'baris baru' (
\n
), bukan carriage return (\r
); yang terakhir akan memiliki keluaranREBOOT|
pada satu baris.)Penjelasan
Menggunakan Perluasan Parameter Bash Shell
${parameter/pattern/string}
:Juga menggunakan konstruksi
$''
kutipan ANSI-C untuk menentukan baris baru sebagai$'\n'
. Menggunakan baris baru secara langsung juga akan berhasil, meski kurang cantik:Contoh lengkapnya
Atau, menggunakan baris baru:
sumber
Apa yang berhasil bagi saya adalah
echo $testVar | tr "\n" " "
Di mana testVar berisi variabel / script-output saya
sumber
Menambahkan jawaban untuk menunjukkan contoh pengupasan beberapa karakter termasuk \ r menggunakan tr dan menggunakan sed. Dan mengilustrasikan menggunakan hexdump.
Dalam kasus saya, saya telah menemukan bahwa perintah yang diakhiri dengan awk print dari item terakhir
|awk '{print $2}'
di baris termasuk carriage-return \ r serta tanda kutip.Saya biasa
sed 's/["\n\r]//g'
menanggalkan carriage-return dan kutipan.Saya juga bisa menggunakan
tr -d '"\r\n'
.Menarik untuk diperhatikan
sed -z
diperlukan jika seseorang ingin menghapus \ n karakter line-feed.Dan ini relevan: Apakah carriage return, linefeed, dan form feed?
sumber
Anda cukup menggunakan
echo -n "|$COMMAND|"
.sumber
Jika Anda menggunakan bash dengan opsi extglob diaktifkan, Anda dapat menghapus hanya spasi kosong melalui:
Output ini:
Atau ganti %% dengan ## untuk hanya mengganti spasi di depan.
sumber