File1
isi:
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
File2
isi:
line1-file2 "25"
line2-file2 "24"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
Setelah eksekusi skrip perl / shell, File2
konten harus menjadi:
line1-file2 "25"
line2-file2 "24"
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
yaitu menempelkan konten File1
di File2
sebelum baris yang berisi "Pointer".
text-processing
awk
sed
perl
pengguna1228191
sumber
sumber
Jawaban:
sed
memiliki fungsi untuk itu, dan dapat melakukan inline modifikasi:Tapi ini menempatkan Pointer Anda di atas file1. Untuk meletakkannya di bawah ini, tunda keluaran saluran:
sumber
-e 1x -e '2,${x;p}' -e '${x;p}'
harus dilakukan? Saya mengerti bahwa Anda bertukar barang di buffer pola dan kemudian mencetaknya, tetapi saya tidak tahu apa dan mengapa Anda menambahkan opsi diam-n
di awal.Tanpa menggunakan
sed
atauawk
...Pertama, temukan garis yang menjadi pola Anda:
Kemudian, gunakan 3 perintah untuk menampilkan hasil yang diinginkan:
Ini memiliki kelemahan mengakses 3 kali file tersebut
file2
, tapi mungkin lebih jelas daripadased
dariawk
solusi.sumber
awk
membuat ini cukup mudah.Masukkan baris sebelum file:
Untuk membuat file dalam dicetak setelah
Pointer
baris, cukup alihkan urutan pola (Anda perlu menambahkan tanda titik koma untuk mendapatkan tindakan default), dan Anda dapat menjatuhkanline
variabel:Dan hanya karena belum ada yang menggunakan
perl
,sumber
system("cat innerfile")
outputinnerfile
ke konsol. Apakah saya melewatkan sesuatu?Pekerjaan mudah untuk
ed
:-r file1
membaca dalam file yang ditentukan setelah baris yang dialamatkan, yang dalam hal ini adalah baris sebelum pencocokan baris pertamaPointer
. Jadi ini akan menyisipkan kontenfile2
hanya sekali bahkan jikaPointer
terjadi pada beberapa baris. Jika Anda ingin menyisipkannya sebelum setiap baris yang cocok tambahkang
bendera lobal:Ganti
,p
denganw
jika Anda ingin mengedit file di tempat.sed
Jawaban yang diterima memang berfungsi untuk sebagian besar kasus tetapi jika marker ada di baris terakhir, perintah tidak akan berfungsi seperti yang diharapkan: ia akan memasukkan kontenFile1
setelah marker.Awalnya saya sudah mencoba dengan:
yang juga berfungsi dengan baik (seperti
r
akan melakukan keajaibannya di akhir siklus) tetapi memiliki masalah yang sama jika marker ada di baris terakhir (tidak adaN
garis ext setelah baris terakhir). Untuk mengatasinya, Anda dapat menambahkan baris baru ke input Anda:Ini akan memasukkan
file2
konten sebelum setiap baris yang cocok. Untuk menyisipkannya hanya sebelum baris yang cocok pertama Anda bisa menggunakanl
oop dan cukup tarikn
garis ext sampai Anda mendapatkan akhir file:Dengan
sed
solusi ini Anda kehilangan kemampuan untuk mengedit di tempat (tetapi Anda dapat mengarahkan ke file lain).sumber
Gunakan loop untuk membaca baris dalam file2. Jika Anda menemukan garis yang dimulai dengan
Pointer
, maka cetak file1. Ini ditunjukkan di bawah ini:sumber
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:... 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 danr
perintah ead diterapkan oleh nomor baris.Anda bisa menyiasatinya:
Tidak semua
sed
s akan menafsirkan-
input standar berarti, tetapi banyak yang menafsirkannya . ( POSIX mengatakansed
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, dansed
akan menerapkannya sertar
ead dalam urutan yang mereka buat. Ini sedikit lebih terlibat - itu memerlukan menggunakan satused
untuka
mengaturPointer
pertandingan ke output yang lainsed
dalam skripnya.Jadi pada dasarnya yang pertama
sed
menulissed
skrip kedua , yangsed
dibaca kedua pada input standar (mungkin ...) dan berlaku pada gilirannya. Yang pertamased
hanya berfungsi pada kecocokan pertama untukPointer
ditemukan, dan setelah ituq
menggunakan input. Tugasnya adalah ...s/[]^$&\./*[]/\\&/g;H
sed
akan perlu menafsirkan setiap bit yang dibaca secara harfiah untuk memperbaikinya. Setelah selesai, letakkan salinan diH
ruang lama.s|.*|/&/!p;//!d|p; x
sed
untukp
mematahkan setiap baris input!
tetapi yang/&/
baru saja kita selamatkan pola; dan kemudiand
menghapus semuanya.p
letakkan perintah di yang keduased
, kemudianx
ubahh
buffer pola lama dan bekerja pada salinan yang disimpan.s|.|r file1&a\\&|p;q
\n
ewline karenased
akan memiliki yang pertama ketika kitaH
menemukan garis sebelumnya. Jadi kita masukkan perintahr file1
dan ikuti dengan\n
ewline kita lalu perintaha\\
untuka
ppend diikuti juga oleh\n
ewline. Semua sisaH
baris kami mengikuti\n
ewline terakhir itu.Skrip yang ditulis pertama terlihat seperti ini:
Pada dasarnya yang kedua
sed
akan mencetak setiap baris tetapi yang pertamased
mengaturnya untuka
dibelanjakan. Untuk baris tertentu, dua penundaan penulisan ke standard-out dijadwalkan - yang pertama adalahr
ead offile1
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.
sumber
Ini cukup sederhana dengan AWK:
File1 ke File2 sebelum pattern = "Pointer"
Pertama memuat konten File1 ke dalam variabel
kemudian lakukan penyisipan
(Atau, jika Anda ingin memasukkan File1 setelah "Pointer")
sumber
cara pilihan saya: templating .
Ini akan mengganti setiap changeme kejadian di origfile dengan isi file2insert . Hapus g terakhir dari sed untuk mengganti hanya kemunculan pertama CHANGEME .
sumber
$x
dalam perintah pertama Anda, ketika itu hanya didefinisikan dalam perintah kedua Anda?[Masukkan konten file ke file lain SEBELUM pola]
[Setelah Pola]
sumber
N
berfungsi dengan baik, tetapi tidak jika POLA cocok dengan input terakhirsumber