Ada beberapa cara untuk menyelesaikan ini dengan sed
. Salah satu caranya adalah pembacaan yang tertunda sebagaimana direkomendasikan dalam jawaban yang diterima. Bisa juga ditulis seperti:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... dengan sedikit melihat-depan secara eksplisit alih-alih melihat-diimplementasikan di tempat lain dengan buffer penahan. Yang pasti akan memiliki masalah yang sama dengan baris terakhir yang catatan @don_crissti, meskipun, karena N
tidak kenaikan siklus baris dan r
perintah ead diterapkan oleh nomor baris.
Anda bisa menyiasatinya:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Tidak semua sed
s akan menafsirkan -
input standar berarti, tetapi banyak yang menafsirkannya . ( POSIX mengatakan sed
harus mendukung -
mean-in standar jika pelaksana ingin -
berarti standar-in ???)
Cara lain adalah menangani konten yang ditambahkan secara berurutan. Ada perintah lain yang menjadwalkan output dengan cara yang sama seperti r
ead, dan sed
akan menerapkannya serta r
ead dalam urutan yang mereka buat. Ini sedikit lebih terlibat - itu memerlukan menggunakan satu sed
untuk a
mengatur Pointer
pertandingan ke output yang lain sed
dalam skripnya.
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
Jadi pada dasarnya yang pertama sed
menulis sed
skrip kedua , yang sed
dibaca kedua pada input standar (mungkin ...) dan berlaku pada gilirannya. Yang pertama sed
hanya berfungsi pada kecocokan pertama untuk Pointer
ditemukan, dan setelah itu q
menggunakan input. Tugasnya adalah ...
s/[]^$&\./*[]/\\&/g;H
- Pastikan bahwa semua pola karakter aman dengan garis miring terbalik karena yang kedua
sed
akan perlu menafsirkan setiap bit yang dibaca secara harfiah untuk memperbaikinya. Setelah selesai, letakkan salinan di H
ruang lama.
s|.*|/&/!p;//!d|p; x
- Beri tahu yang kedua
sed
untuk p
mematahkan setiap baris input !
tetapi yang /&/
baru saja kita selamatkan pola; dan kemudian d
menghapus semuanya. p
letakkan perintah di yang kedua sed
, kemudian x
ubah h
buffer pola lama dan bekerja pada salinan yang disimpan.
s|.|r file1&a\\&|p;q
- Satu-satunya karakter yang bekerja dengan kami di sini adalah
\n
ewline karena sed
akan memiliki yang pertama ketika kita H
menemukan garis sebelumnya. Jadi kita masukkan perintah r file1
dan ikuti dengan \n
ewline kita lalu perintah a\\
untuk a
ppend diikuti juga oleh \n
ewline. Semua sisa H
baris kami mengikuti \n
ewline terakhir itu.
Skrip yang ditulis pertama terlihat seperti ini:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Pada dasarnya yang kedua sed
akan mencetak setiap baris tetapi yang pertama sed
mengaturnya untuk a
dibelanjakan. Untuk baris tertentu, dua penundaan penulisan ke standard-out dijadwalkan - yang pertama adalah r
ead of file1
dan yang kedua adalah salinan dari garis yang kita inginkan setelahnya. sed
Dokter yang pertama bahkan tidak perlu dalam kasus ini (lihat? Tidak ada garis miring terbalik) tetapi penting untuk melarikan diri dengan aman seperti yang saya lakukan di sini setiap kali pencocokan pola digunakan kembali sebagai input.
Ngomong-ngomong, jadi ... ada beberapa cara.