Bagaimana saya bisa membagi huruf kata, dengan masing-masing huruf dalam baris yang terpisah?
Misalnya, mengingat "StackOver"
saya ingin melihat
S
t
a
c
k
O
v
e
r
Saya baru mengenal bash jadi saya tidak tahu harus mulai dari mana.
command-line
split
words
Sijaan Hallak
sumber
sumber
Here string
, grosso modo setara denganecho foo | ...
kurang mengetik. Lihat tldp.org/LDP/abs/html/x17837.html.
menjadi\B
(tidak cocok dengan batas kata).sed
seperti:sed -et -e's/./\n&/g;//D'
Anda mungkin ingin memecah cluster grapheme daripada karakter jika tujuannya adalah untuk mencetak teks secara vertikal. Misalnya dengan
e
aksen akut:Dengan cluster grapheme (
e
dengan aksen akutnya akan menjadi satu cluster grapheme):(atau
grep -Po '\X'
dengan grep GNU yang dibangun dengan dukungan PCRE)Dengan karakter (di sini dengan GNU
grep
):fold
dimaksudkan untuk memecah karakter, tetapi GNUfold
tidak mendukung karakter multi-byte, jadi ia memecah pada byte:Pada StackOver yang hanya terdiri dari karakter ASCII (jadi satu byte per karakter, satu karakter per cluster grapheme), ketiganya akan memberikan hasil yang sama.
sumber
grep -Po
tidak melakukan apa yang diharapkan (sepertigrep -P
halnya).grep -Po .
menemukan karakter (dan aksen akut kombinasi setelah karakter baris baru tidak valid), dangrep -Po '\X'
menemukan cluster graphem untuk saya. Anda mungkin memerlukan versi grep dan / atau PCRE terbaru agar dapat berfungsi dengan baik (atau cobagrep -Po '(*UTF8)\X'
)Jika Anda memiliki perl6 di kotak Anda:
bekerja terlepas dari lokal Anda.
sumber
Dengan banyak
awk
versisumber
awk -v FS='' -v OFS='\n' '{$1=$1};1'
(bertanya-tanya apakah itu lebih portabel karena-F ''
mungkin menghasilkan ERE://
)Di bawah ini akan menjadi generik:
sumber
sumber
Karena Anda secara khusus meminta jawaban dalam bash, inilah cara untuk melakukannya dalam bash murni:
Perhatikan bahwa ini akan menangkap baris baru di akhir dokumen "di sini ". Jika Anda ingin menghindari itu, tetapi tetap mengulangi karakter dengan bash loop, gunakan
printf
untuk menghindari baris baru.sumber
Juga Python 2 dapat digunakan dari baris perintah:
atau:
atau (seperti yang dikomentari oleh 1_CR) dengan Python 3 :
sumber
Anda bisa menggunakan
fold (1)
perintah. Ini lebih efisien daripadagrep
dansed
.Satu perbedaan signifikan adalah lipatan akan mereproduksi garis kosong di output:
sumber
Anda dapat menangani karakter multibyte seperti:
Yang bisa sangat berguna ketika Anda bekerja dengan input langsung karena tidak ada buffering di sana dan karakter dicetak segera setelah semuanya utuh .
sumber
sed
skrip. saya tidak akan menulis yang benar tentang sekarang - saya cukup mengantuk. itu benar-benar berguna, ketika membaca terminal.dd
akan memecah karakter multibyte, sehingga output tidak akan menjadi teks lagi sehingga perilaku sed tidak ditentukan sesuai POSIX.Anda dapat menggunakan batas kata juga ..
sumber
Dalam bash:
Ini berfungsi dengan teks apa saja dan dengan hanya bash internal (tidak ada utilitas eksternal yang disebut), jadi, harus cepat pada string yang sangat singkat.
Keluaran:
Jika boleh mengubah IFS dan mengubah parameter posisi, Anda juga dapat menghindari panggilan sub-shell:
sumber
pembaruan di sini adalah cara hacky | tercepat | pureBash!
untuk lebih kedahsyatan
sumber
fold -b1
?ini akan membagi kata Anda dan menyimpannya dalam array
var
.sumber
sumber