Semua hal dipertimbangkan, melahap seluruh file mungkin cara tercepat untuk pergi.
Sintaks dasar adalah sebagai berikut:
sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'
Pikiran Anda, melahap seluruh file mungkin tidak menjadi pilihan jika file tersebut sangat besar. Untuk kasus seperti itu, jawaban lain yang disediakan di sini menawarkan solusi khusus yang dijamin dapat bekerja pada jejak memori kecil.
Untuk semua situasi hack dan slash lainnya, cukup dengan menambahkan -e '1h;2,$H;$!d;g'diikuti oleh sedargumen regex asli Anda cukup banyak menyelesaikan pekerjaan.
misalnya
$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat
Apa yang -e '1h;2,$H;$!d;g'harus dilakukan
The 1, 2,$, $!bagian adalah garis penentu yang batas yang garis perintah langsung berikut berjalan pada.
1: Baris pertama saja
2,$: Semua baris mulai dari yang kedua
$!: Setiap baris selain yang terakhir
Jadi diperluas, inilah yang terjadi pada setiap baris dari input jalur N.
1: h, d
2: H, d
3: H, d
.
.
N-2: H, d
N-1: H, d
N: H, g
The gperintah tidak diberi specifier line, tetapi sebelumnya dperintah memiliki klausul khusus " Mulai siklus berikutnya. ", Dan ini mencegah gdari berjalan pada semua lini kecuali yang terakhir.
Adapun arti dari setiap perintah:
- Pertama
hdiikuti oleh Hs pada setiap salinan baris kata baris masukan ke dalam sed's ruang ditahan . (Pikirkan buffer teks sewenang-wenang.)
- Setelah itu,
dbuang setiap baris untuk mencegah agar baris-baris ini tidak ditulis ke output. The ruang hold namun yang diawetkan.
- Akhirnya, pada baris terakhir,
gmengembalikan akumulasi setiap baris dari ruang tunggu sehingga sedmampu menjalankan regexnya pada seluruh input (daripada secara garis-pada-waktu), dan karenanya mampu cocok pada \ns.