Cara mengganti kemunculan ketiga string dalam file menggunakan sed
perintah.
Contoh:
Ubah hanya kejadian ketiga is
ke us
dalam file.
File input saya mengandung:
hai this is linux.
hai this is unix.
hai this is mac.
hai this is unchanged.
Saya mengharapkan output adalah:
hai this is linux.
hai thus is unix.
hai this is mac.
hai this is unchanged.
text-processing
sed
perl
Sureshkumar
sumber
sumber
sed
bukan alat yang tepat untuk pekerjaan itu.Jawaban:
Ini jauh lebih mudah dilakukan
perl
.Untuk mengubah 3 rd terjadinya:
Untuk mengubah setiap 3 rd terjadinya:
sumber
Ketika string pengganti hanya muncul sekali per baris, Anda dapat menggabungkan berbagai utilitas.
Ketika input ada di file "input" dan Anda mengganti "is" by "us", Anda dapat menggunakan
sumber
is
per baris.Script di bawah ini (menggunakan sintaksis GNU
sed
) dapat digunakan untuk mengedit inplace bukan untuk output karena menghentikan garis cetak setelah substitusi yang diinginkan:Jika Anda menyukai choroba, Anda dapat memodifikasi di atas
yang menghasilkan semua lini
Atau Anda harus meletakkan semua garis di ruang pola (dalam memori jadi hati-hati dengan batasan ukuran) dan lakukan penggantian
sumber
Anda dapat menggunakannya
sed
untuk itu jika sebelumnya baris baru diganti dengan karakter lain, misalnya:Dan hal yang sama dengan pure (GNU)
sed
:(
sed
Penggantian baris baru dicuri tanpa malu-malu dari https://stackoverflow.com/a/1252191/4488514 )sumber
sed
sintaksis khusus GNU , Anda mungkin juga menggunakannyased -z 's/is/us/3'
.-z
pasti merupakan fitur baru, sayaGNU sed version 4.2.1
tidak tahu apa-apa tentang opsi ini.\x0
melangkah.Sedikit
sed
saja membawa penghitunganis
kejadian dari satu baris ke yang berikutnya. Ini seharusnya dapat menangani sebanyak mungkinis
es per baris saat Anda melemparkannya, dan itu tidak perlu buffer garis lama sementara itu - itu hanya mempertahankan satu karakter baris baru untuk setiapis
yang ia temui yang bukan bagian dari kata lain.Hasilnya adalah ia akan memodifikasi hanya kejadian ketiga dalam file - dan itu akan membawa jumlah per baris. Jadi jika sebuah file terlihat seperti:
... itu akan mencetak ...
Pertama-tama menangani kasing tepi dengan memasukkan spasi di kepala dan ekor setiap garis. Ini membuat batasan kata sedikit lebih mudah untuk dipastikan.
Selanjutnya mencari
is
es yang valid dengan memasukkan\n
garis sebelum sebelum semua kejadianis
yang mendahului nol atau satu karakter tanda baca diikuti oleh spasi. Itu lulus lain dan menghapus semua\n
ewline yang segera didahului oleh karakter bukan spasi. Penanda yang ditinggalkan ini akan cocokis.
danis
tetapi tidakthis
atau?is
.Selanjutnya mengumpulkan setiap penanda ke ekor tali - untuk setiap
\ni
pertandingan pada garis itu menambahkan\n
garis ke ekor tali dan menggantinya dengan salah satui
atauu
. Jika ada 3\n
baris dalam satu baris berkumpul di ujung string maka ia menggunakan u - selain itu i. Au pertama kali digunakan juga yang terakhir - penggantian memicu loop tak terbatas yang bermuara keget line, print line, get line, print line,
dan seterusnya.Pada akhir setiap siklus loop coba, ia membersihkan ruang yang disisipkan, mencetak hanya hingga baris baru yang pertama kali terjadi dalam ruang pola, dan berjalan lagi.
Saya akan menambahkan
l
perintah ook di bagian atas loop seperti:... dan lihat apa fungsinya saat bekerja dengan input ini:
... jadi inilah fungsinya:
Lebih masuk akal mungkin dengan lebih banyak
is
es per baris:Praktis hal yang sama tetapi ditulis dengan POSIX BRE dan penanganan argumen yang belum sempurna.
...mendapat...
... dan jika saya mengaktifkan
${dbg}
:... kita bisa menontonnya iterate ...
sumber
Berikut adalah solusi logis yang menggunakan
sed
dantr
tetapi harus ditulis dalam skrip agar dapat berfungsi. Kode di bawah ini menggantikan setiap kemunculan kata yang ditentukan dalamsed
perintah. Gantii=3
dengani=n
untuk membuat ini berfungsi untuk siapa punn
.Kode:
Mengapa ini bekerja:
Misalkan file teksnya
a b b b b a c a d a b b b a b e b z b s b a b
.Ketika n = 2: kami ingin mengganti setiap kemunculan kedua
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . ^ . ^ . . . . . . ^ . . ^ . . . ^ . ^ . ^
Ketika n = 3: kami ingin mengganti setiap kemunculan ketiga
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . . ^ . . . . . . . ^ . . . . ^ . . . . . ^
Ketika n = 4: kami ingin mengganti setiap kemunculan ketiga
b
.sumber