Saya memiliki garis panjang yang ingin saya sisipkan spasi setiap 4 karakter, pada satu baris teks padat untuk membuatnya lebih mudah dibaca, apa cara paling sederhana untuk melakukan ini? juga saya harus dapat memasukkan saluran dari pipa. misalnya
echo "foobarbazblargblurg" | <some command here>
memberi
foob arba zbla rgbl urg
command-line
shell
text-processing
xenoterracide
sumber
sumber
sed
aku mencoba dulu aku bisa menendang diriku sendiri.'s/.\{4\}/& /g;s/ $//'
Anda dapat menggunakan contoh sederhana berikut ini:
sumber
sed
jawabannya. Saya tidak tahu tentangfold
sebelumnya.fold
saat ini, tidak berfungsi dengan karakter multi-byte (sepertiecho €€€€€€€€ | fold -w4 | paste -sd' ' -
pada UTF-8).Berikut ini contoh penggunaan
grep
danxargs
:sumber
xargs
berjalanecho
secara default, jadi itu tidak akan berfungsi dengan kata-kata seperti-nen
atau yang mengandung garis miring terbalik tergantung padaecho
implementasinya. Anda akan melihat karakter garis ganjil sesekali juga jika xarg berjalan lebih dari satuecho
. Lebih baik untuk pipapaste -sd ' ' -
. Perhatikan bahwa-o
ini bukan opsi standar.Dalam bash saja, tidak ada perintah eksternal:
atau sebagai versi pipa satu baris:
Cara kerjanya adalah mengonversi setiap karakter string menjadi "(.)" Untuk pencocokan dan tangkapan regex
=~
, kemudian hanya mengeluarkan ekspresi yang diambil dariBASH_REMATCH[]
array, dikelompokkan sesuai kebutuhan. Ruang depan / belakang / tengah dipertahankan, hapus tanda kutip"${BASH_REMATCH[@]:1}"
untuk menghilangkannya.Di sini dibungkus dalam suatu fungsi, yang ini akan memproses argumennya atau membaca stdin jika tidak ada argumen:
Anda dapat dengan mudah mengukur parameter hitungan untuk menyesuaikan string format yang sesuai.
Sebuah ruang tambahan ditambahkan, gunakan dua
printf
s bukan satu jika itu masalah:Yang pertama
printf
mencetak (hingga) 4 karakter pertama, yang kedua secara kondisional mencetak yang lainnya (jika ada) dengan ruang utama untuk memisahkan grup. Tes ini untuk 5 elemen bukan 4 untuk memperhitungkan elemen nol.Catatan:
printf
's%c
dapat digunakan sebagai pengganti%s
,%c
(mungkin) membuat maksud lebih jelas, tapi itu bukan multi-byte karakter aman. Jika versi bash Anda mampu, di atas semua karakter multi-byte aman.printf
menggunakan kembali format string-nya hingga kehabisan argumen, jadi ia hanya melahap 4 argumen sekaligus, dan menangani argumen trailing (jadi tidak perlu case tepi, tidak seperti beberapa jawaban lain di sini yang bisa dibilang salah)BASH_REMATCH[0]
adalah seluruh string yang cocok, jadi hanya output yang dimulai dari indeks 1printf -v myvar ...
sebagai gantinya untuk menyimpan ke variabelmyvar
(tunduk pada perilaku read-loop / subshell yang biasa)printf "\n"
jika diperlukanAnda dapat membuat cara di atas berfungsi
zsh
jika Anda menggunakan arraymatch[]
sebagai gantiBASH_REMATCH[]
, dan kurangi 1 dari semua indeks karenazsh
tidak mempertahankan elemen 0 dengan seluruh kecocokan.sumber
Dengan
zsh
hanya:Atau
ksh93
hanya dengan :Hanya dengan shell POSIX saja (juga menghindari ruang tambahan jika panjang input adalah kelipatan 4):
Nah, itu untuk karakter . Jika Anda ingin melakukannya di cluster grapheme (misalnya, untuk memecah
Stéphane
, ditulis sebagai$'Ste\u0301phane'
, sepertiStép hane
dan tidakSte phan e
), denganzsh
:Dengan ksh93, Anda dapat memecah dengan lebar layar juga, yang akan bekerja untuk itu di
Stéphane
atas, tetapi juga bisa membantu ketika beberapa jenis karakter lain dari lebar nol atau lebar ganda terlibat:sumber
Saya akan menjawab dengan hanya memasukkan spasi sesuai kebutuhan sehingga spasi muncul setidaknya setelah setiap 4 karakter pada satu baris; tidak yakin ke arah mana Anda ingin menangani kasus ini. Misalnya, diberi input "aa bbccdd", Anda akan mendapatkan output "aa bbcc dd" daripada "aa b bccd d".
Saya menggunakan Perl untuk lookahead, tapi saya tidak terlalu akrab dengan Perl secara umum, jadi mungkin diperlukan penyesuaian:
sumber
Saya telah melakukan ini dengan menggunakan python
Pertama saya membaca file kemudian saya membaginya dengan 4 karakter dan menambahkan ruang
/root/l.txt ==> Terdiri dari konten yang Anda berikan dalam contoh
keluaran
sumber