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 rperintah ead diterapkan oleh nomor baris.
Anda bisa menyiasatinya:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Tidak semua seds 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 read, dan sedakan menerapkannya serta read dalam urutan yang mereka buat. Ini sedikit lebih terlibat - itu memerlukan menggunakan satu seduntuk amengatur Pointerpertandingan ke output yang lain seddalam 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 sedmenulis sedskrip kedua , yang seddibaca kedua pada input standar (mungkin ...) dan berlaku pada gilirannya. Yang pertama sedhanya berfungsi pada kecocokan pertama untuk Pointerditemukan, dan setelah itu qmenggunakan input. Tugasnya adalah ...
s/[]^$&\./*[]/\\&/g;H
- Pastikan bahwa semua pola karakter aman dengan garis miring terbalik karena yang kedua
sedakan perlu menafsirkan setiap bit yang dibaca secara harfiah untuk memperbaikinya. Setelah selesai, letakkan salinan di Hruang lama.
s|.*|/&/!p;//!d|p; x
- Beri tahu yang kedua
seduntuk pmematahkan setiap baris input !tetapi yang /&/baru saja kita selamatkan pola; dan kemudian dmenghapus semuanya. pletakkan perintah di yang kedua sed, kemudian xubah hbuffer pola lama dan bekerja pada salinan yang disimpan.
s|.|r file1&a\\&|p;q
- Satu-satunya karakter yang bekerja dengan kami di sini adalah
\newline karena sedakan memiliki yang pertama ketika kita Hmenemukan garis sebelumnya. Jadi kita masukkan perintah r file1dan ikuti dengan \newline kita lalu perintah a\\untuk append diikuti juga oleh \newline. Semua sisa Hbaris kami mengikuti \newline terakhir itu.
Skrip yang ditulis pertama terlihat seperti ini:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Pada dasarnya yang kedua sedakan mencetak setiap baris tetapi yang pertama sedmengaturnya untuk adibelanjakan. Untuk baris tertentu, dua penundaan penulisan ke standard-out dijadwalkan - yang pertama adalah read of file1dan yang kedua adalah salinan dari garis yang kita inginkan setelahnya. sedDokter 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.