Jika Anda ingin melakukan ini dan menghapus spasi yang Anda perlukan:
echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'
Dua perintah pertama dalam pipa dijelaskan dengan baik oleh @TMS dalam jawabannya, sebagaimana diedit oleh @James. Perintah terakhir berbeda dari komentar @TMS karena benar dan telah diuji. Penjelasannya adalah:
sed
adalah s tream ed itu.s
adalah s perintah pengganti./
membuka ekspresi reguler - karakter apa pun dapat digunakan./
konvensional, tetapi tidak nyaman untuk memproses, katakanlah, XML atau nama jalur./
atau karakter pengganti yang Anda pilih, menutup ekspresi reguler dan membuka string substitusi.- Di
/ */
*
cocok dengan urutan karakter sebelumnya (dalam hal ini, spasi). /
atau karakter pengganti yang Anda pilih, menutup string pengganti. Dalam hal ini, string pengganti//
kosong, yaitu kecocokan dihapus.g
adalah opsi untuk melakukan substitusi ini g secara global di setiap baris, bukan hanya sekali untuk setiap baris.- Kutipan membuat parser perintah tidak bingung - seluruh urutan diteruskan ke
sed
sebagai opsi pertama, yaitused
skrip.
@TMS otak anak (sed 's/^ *//'
) hanya menghapus spasi dari awal setiap baris (^
cocok dengan awal baris - 'ruang pola' di sed
-berbicara).
Jika Anda juga ingin menghapus baris baru, cara termudah adalah menambahkan
| tr -d '\n'
ke pipa perintah. Ini berfungsi sebagai berikut:
|
memasukkan aliran yang diproses sebelumnya ke input standar perintah ini.tr
adalah tr perintah anslate.-d
menentukan menghapus karakter yang cocok.- Kutipan mencantumkan karakter yang cocok - dalam hal ini hanya baris baru (
\n
).Terjemahkan hanya cocok dengan karakter tunggal, bukan urutan.
sed
secara unik terbelakang ketika berhadapan dengan baris baru. Ini karena sed
adalah salah satu unix
tertua perintah - itu dibuat sebelum orang benar-benar tahu apa yang mereka lakukan. Perangkat lunak warisan yang meluas mencegahnya diperbaiki. Saya tahu ini karena saya lahir sebelum unix
lahir.
Asal historis dari masalah ini adalah gagasan bahwa baris baru adalah pemisah baris, bukan bagian dari baris. Oleh karena itu dilucuti oleh utilitas pemrosesan lini dan dimasukkan kembali oleh utilitas keluaran. Masalahnya adalah, ini membuat asumsi tentang struktur data pengguna dan memberlakukan batasan yang tidak wajar di banyak pengaturan. sed
ketidakmampuan untuk menghapus baris baru dengan mudah adalah salah satu contoh paling umum dari ideologi cacat yang menyebabkan kesedihan.
Dimungkinkan untuk menghapus baris baru dengan sed
- hanya saja semua solusi yang saya ketahui tentang make sed
memproses seluruh file sekaligus, yang tersedak untuk file yang sangat besar, mengalahkan tujuan editor aliran. Solusi apa pun yang mempertahankan pemrosesan garis, jika memungkinkan, akan menjadi sarang tikus yang tidak dapat dibaca dari banyak pipa.
Jika Anda bersikeras menggunakan sed
coba:
sed -z 's/\n//g'
-z
memberi tahu sed
untuk menggunakan null sebagai pemisah baris.
Secara internal, sebuah string di C
diakhiri dengan null. -z
opsi juga merupakan hasil dari warisan, disediakan sebagai kemudahan untuk C
programmer yang mungkin ingin menggunakan file sementara yang diisi dengan C
-string dan rapi oleh baris baru. Mereka kemudian dapat dengan mudah membaca dan memproses satu string dalam satu waktu. Sekali lagi, asumsi awal tentang kasus penggunaan memberlakukan batasan artifisial pada data pengguna.
Jika Anda menghilangkan g
opsi, perintah ini hanya menghapus baris baru pertama. Dengan -z
opsi sed
menginterpretasikan seluruh file sebagai satu baris (kecuali ada null tersesat yang disematkan dalam file), diakhiri dengan null sehingga ini juga mencekik file besar.
Anda mungkin berpikir
sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'
mungkin berhasil. Perintah pertama menempatkan null di depan setiap baris berdasarkan baris demi baris, menghasilkan \n\x00
mengakhiri setiap baris. Perintah kedua menghapus satu baris baru dari setiap baris, sekarang dibatasi oleh nol - hanya akan ada satu baris baru berdasarkan perintah pertama. Yang tersisa hanyalah null palsu. Sejauh ini bagus. Gagasan rusak di sini adalah bahwa pipa akan memberi makan perintah terakhir berdasarkan baris demi baris, karena begitulah aliran dibangun. Sebenarnya, perintah terakhir, seperti yang tertulis, hanya akan menghapus satu nol karena sekarang seluruh file tidak memiliki baris baru dan karenanya hanya satu baris.
Implementasi pipa sederhana menggunakan file sementara perantara dan semua input diproses dan dimasukkan ke file. Perintah selanjutnya mungkin berjalan di utas lain, secara bersamaan membaca file itu, tetapi hanya melihat aliran secara keseluruhan (meskipun tidak lengkap) dan tidak mengetahui batas potongan yang memberi makan file. Bahkan jika pipa adalah buffer memori, perintah selanjutnya melihat aliran secara keseluruhan. Cacat tersebut tidak dapat dipisahkan dari sed
.
Agar pendekatan ini berhasil, Anda memerlukan g
opsi pada perintah terakhir, jadi sekali lagi, tersedak file besar.
Intinya begini:jangan gunakan sed
untuk memproses baris baru.
echo hello | hexdump -v -e '/1 "%02X "'
echo -n "Hello" | od -A n -t x1
Penjelasan:
-
echo
program akan memberikan string ke perintah berikutnya. -
-n
bendera memberi tahu gema untuk tidak membuat baris baru di akhir "Halo". od
program adalah program "dump oktal". (Kami akan memberikan bendera untuk memberitahukannya membuangnya dalam heksadesimal, bukan oktal.)-
-A n
flag adalah kependekan dari--address-radix=n
, dengan n singkatan dari "none". Tanpa bagian ini, perintah akan menampilkan awalan alamat numerik yang jelek di sisi kiri. Ini berguna untuk dump besar, tetapi untuk string pendek tidak diperlukan. -t x1
flag adalah kependekan dari--format=x1
, dengan x adalah kependekan dari "hexadecimal" dan 1 berarti 1 byte.