jawaban di bawah ini, dengan baris perintah nl, adalah solusi yang jauh lebih sederhana.
Daniel Ribeiro
2
@DanielRibeiro lebih sederhana tetapi kurang dapat diandalkan dan kurang fleksibel.
Jonathan Hartley
@DanielRibeiro Jawaban yang digunakan nljuga SALAH. Dalam kode sumber, itu tidak akan pernah memberi Anda nomor baris yang benar, karena tidak menghitung baris hanya dengan spasi putih.
oligofren
@jtbandes Solusi Anda menambahkan spasi antara nomor baris dan tab (setidaknya di mac saya)
Yossi Vainshtein
55
Perintah nl harus melakukan ini, tetapi juga menambah spasi sebelum nomor baris. Itu bagian dari Linux coreutils.
Sebenarnya, Anda bisa mengatakan nluntuk menghilangkan spasi sebelum nomor. Cukup gunakan -w1opsi untuk memberi tahu itu lebar minimum untuk angka adalah 1.
cjm
2
Hati-hati bahwa 'nl' mengasumsikan secara default bahwa teks Anda dibagi menjadi 'halaman' dengan header dan footer, semua dibatasi oleh garis-garis seperti '\:' atau '\: \:' atau '\: \: \:'. Jika teks Anda memiliki baris seperti ini di dalamnya, maka 'nl' akan menghasilkan hasil yang tidak terduga, seperti menelan garis-garis itu, bagian tanpa penomoran, atau memulai kembali penomoran dari 1 di bagian. Gunakan -dXY (di mana XY adalah sepasang karakter yang tidak muncul sendiri pada teks Anda) untuk mencegah perilaku ini. Dalam kasus umum, ini mungkin sulit diprediksi, jadi saya sarankan menggunakan salah satu solusi lain di halaman ini.
Jonathan Hartley
Menggunakan '-w1' tidak hanya akan menghapus spasi setelah angka, tetapi juga akan memotong angka garis menjadi hanya satu karakter lebar, yang berarti nomor garis Anda hanya menampilkan digit paling signifikan mereka. Ini hampir pasti bukan yang Anda inginkan.
Jonathan Hartley
4
Dengan -nlnAnda dapat dibenarkan-kiri jika Anda tidak ingin spasi sebelum nomor baris. Juga, untuk menentukan pemisah tab Anda dapat menggunakan -s$'\t'atau -s' '(masukkan tab di antara tanda kutip tunggal dengan ctrl+vitu tab).
don_crissti
2
@JonathanHartley nl -w1(dari GNU coreutils 8.24) tidak memotong angka baris.
Skippy le Grand Gourou
10
sed = test.txt | sed 'N;s/\n/\t/'
Perintah "sed =" akan mencetak nomor baris diikuti dengan carriage return dan kemudian baris berikutnya.
Ekspresi "N; s / \ n / \ t /" akan mengambil setiap baris, dapatkan baris berikutnya (yaitu nomor baris dan baris), dan ganti carriage return dengan tab.
Mencetak "t" tanpa tab dengan versi sed saya: 8t Saya melihat pikiran terbaik dari generasi saya dihancurkan oleh kegilaan 9t, kelaparan telanjang histeris,
Richard Hoskins
1
Perhatikan bahwa \nini adalah umpan baris (biasanya disebut "baris baru", karena penggunaannya yang pertama tersebar luas di Unix), dan \rmerupakan carriage return. Penggunaan Windows \r\n(juga disebut sebagai CRLF).
Camilo Martin
(Yay nitpicking!)
Camilo Martin
Jika kita akan masuk ke nitpicking tentang bagaimana windows mungkin berbeda, maka kita mungkin perlu mempertimbangkan UTF16.
Jawaban:
sumber
awk '{print NR, "\t", $0}'
.nl
juga SALAH. Dalam kode sumber, itu tidak akan pernah memberi Anda nomor baris yang benar, karena tidak menghitung baris hanya dengan spasi putih.Perintah nl harus melakukan ini, tetapi juga menambah spasi sebelum nomor baris. Itu bagian dari Linux coreutils.
sumber
nl
untuk menghilangkan spasi sebelum nomor. Cukup gunakan-w1
opsi untuk memberi tahu itu lebar minimum untuk angka adalah 1.-nln
Anda dapat dibenarkan-kiri jika Anda tidak ingin spasi sebelum nomor baris. Juga, untuk menentukan pemisah tab Anda dapat menggunakan-s$'\t'
atau-s' '
(masukkan tab di antara tanda kutip tunggal denganctrl+v
itutab
).nl -w1
(dari GNU coreutils 8.24) tidak memotong angka baris.Perintah "sed =" akan mencetak nomor baris diikuti dengan carriage return dan kemudian baris berikutnya.
Ekspresi "N; s / \ n / \ t /" akan mengambil setiap baris, dapatkan baris berikutnya (yaitu nomor baris dan baris), dan ganti carriage return dengan tab.
sumber
\n
ini adalah umpan baris (biasanya disebut "baris baru", karena penggunaannya yang pertama tersebar luas di Unix), dan\r
merupakan carriage return. Penggunaan Windows\r\n
(juga disebut sebagaiCRLF
).cat -n menambahkan linenumber sebagai "123 linecontents" dan regexp memodifikasinya menjadi "linenumberTABlinecontents"
sumber
atau
sumber
Bagaimana tentang
?
sumber
Oke, inilah solusi bash satu baris:
Pengaturan IFS pertama memberi tahu bash untuk membaca baris penuh pada satu waktu. Baris kedua me-reset IFS ke default.
Sebagai bonus tambahan, ini berjalan sepenuhnya di shell Anda dan tidak menjalankan program!
sumber
Oke, karena kami sedang mengumpulkan cara untuk melakukan ini,
sumber
atau untuk beberapa non-GNU
sed
:sumber