Saya Memiliki file yang memiliki teks seperti ini:
AAAA
BBBB
CCCC
DDDD
1234
5678
9012
3456
EEEE
7890
dll ...
Dan saya ingin mencocokkan garis Alfabet dengan garis Numerik sehingga menjadi seperti ini:
AAAA 1234
BBBB 5678
CCCC 9012
DDDD 3456
EEEE 7890
Adakah yang tahu cara sederhana untuk mencapainya?
emacs
.. Apakah Anda mencarielisp
solusi, atau bagaimana menjalankan shell-script dari dalam emacs?Jawaban:
Salah satu cara menggunakan
perl
:Isi dari
script.pl
:Isi dari
infile
:Jalankan seperti:
Dan hasil:
sumber
s/\A\s*(.*?)\s*\Z/\1/
.Dalam
awk
, mempertahankan baris kosong, dengan asumsi file diformat dengan baik, tetapi logika dapat ditambahkan untuk memeriksa file:sumber
atau, dalam satu langkah, tanpa file temp
Langkah terakhir
sed
menghilangkan pembatas pada baris kosong, yang diperkenalkan olehpaste
...sumber
Dengan emacs gunakan operasi persegi panjang untuk memotong garis teks dan menempelkannya sebelum garis numerik.
sumber
Jika entri dalam urutan,
Membagi input menjadi entri alfabet dan entri numerik, menggunakan
grep
:grep "[[:alpha:]]\+" < file > alpha
grep "[[:digit:]]\+" < file > digit
Gabung dua file yang dihasilkan,
alpha
dandigit
, menggunakanpaste
:paste alpha digit
(Anda dapat menambahkan-d " "
sehingga menggunakan spasi alih-alih tab)sumber
paste <(grep "[[:alpha:]]\+" file) <(grep "[[:digit:]]\+" file)
atau dengan proses substitusi tunggal:grep "[[:alpha:]]\+" file | paste - <(grep "[[:digit:]]\+" file)
.Sayang sekali, awk tidak memiliki fungsi push / pop / unshift / shift yang bagus. Berikut cuplikan singkat Perl
sumber
default
klausa tersebut, garis-garis kosong segera dicetak, sehingga kosong sebelum "1234" akan ditampilkan sebelum garis "AAAA".Berikan file dengan teks, coba gunakan
pr
dan proses sintaksis substitusi seperti di bawah ini:Anda dapat menyesuaikan lebar dengan
-w9
atau menghapus spasi dengansed "s/ //g"
.sumber