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 sed
argumen 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 g
perintah tidak diberi specifier line, tetapi sebelumnya d
perintah memiliki klausul khusus " Mulai siklus berikutnya. ", Dan ini mencegah g
dari berjalan pada semua lini kecuali yang terakhir.
Adapun arti dari setiap perintah:
- Pertama
h
diikuti oleh H
s pada setiap salinan baris kata baris masukan ke dalam sed
's ruang ditahan . (Pikirkan buffer teks sewenang-wenang.)
- Setelah itu,
d
buang setiap baris untuk mencegah agar baris-baris ini tidak ditulis ke output. The ruang hold namun yang diawetkan.
- Akhirnya, pada baris terakhir,
g
mengembalikan akumulasi setiap baris dari ruang tunggu sehingga sed
mampu menjalankan regexnya pada seluruh input (daripada secara garis-pada-waktu), dan karenanya mampu cocok pada \n
s.