Saya sedang mengerjakan sebuah proyek di mana saya perlu memperbaiki ribuan baris data. Saya sudah menyelesaikan setengah pekerjaan dan sekarang saya terjebak di bagian akhir.
Saya memiliki file bernama tree.txt yang memiliki daftar semua node, namun karena beberapa bug atau sesuatu, banyak node memiliki nama tag yang salah. tree.txt-
Main_Overview/Ballast/BA-02:Tag=BA-02
Main_Overview/Ballast/BA-03:Tag=BA-02-1
Main_Overview/Ballast/BA-04:Tag=BA-02-2
Seperti yang terlihat di atas nama tag simpul BA-03 dan BA-04 tidak benar, sehingga menggunakan Penanganan file di CI dapat memperbaiki file teks ini dan juga mencetak semua tag yang salah dari masing-masing node dalam file seperti di bawah ini. salah_tags.txt-
"BA-02-1" "BA-03"
"BA-02-2" "BA-04"
Sekarang hal terakhir adalah ada banyak file lain di mana nama tag yang salah digunakan dan saya harus mengganti semua tag yang salah dengan yang benar.
Pendekatan saya untuk memecahkan masalah ini adalah ->
- Saya akan memiliki dua variabel simpul dan tag , ini dua variabel akan sampai di sana Data dari atas incorrect_tag.txt . Saya akan mencari nilai tag di setiap file dan menggantinya dengan nilai masing-masing node.
- Setelah saya selesai mencari dan mengganti tag pertama di semua file, itu akan melakukan hal yang sama untuk yang tersisa.
Namun karena pengetahuan saya yang terbatas, saya tidak tahu apakah itu mungkin atau tidak. Bahkan jika saya mendapatkan bantuan tentang sintaks, saya akan dapat melakukan sisanya. Terima kasih
Sunting-
File lain di mana saya perlu mencari dan mengganti data berbeda .. misalnya Ballast.j1
:1176:489:15:30:CompID=118680:Text=BA-02:uiFont=Arial-PLAIN-10:
:1269:489:15:30:CompID=118681:Text=BA-02-1:uiFont=Arial-PLAIN-10:
:1013:489:15:30:CompID=118677:Text=BA-02-2:uiFont=Arial-PLAIN-10:
Ada hampir 2000 file .j1 di mana saya akan mencari setiap nama tag di semua file .j1 dan menggantinya dengan nama tag atau node yang benar.
Jawaban:
Apakah Anda hanya mencari ini?
(Coba tanpa
-i
melihat output tanpa menulis kembali ke file asli - pipaless
sehingga Anda dapat berhenti dan gulir bolak-balik.)Tanda kurung dalam ekspresi pertama mencari string antara garis miring dan titik dua; jika kita menemukan ini segera diikuti oleh
Tag=
dan string yang sama dengan yang cocok di antara tanda kurung, kita baik. Tanda kurung backslashed menangkap string ini sehingga kita dapat merujuk kembali sebagai\1
.Jika kami tidak menemukan pola ini, string sesudahnya
Tag=
harus berbeda dari string yang ditangkap; jika demikian, ganti string setelahnyaTag=
dengan string yang ditangkap. Ekspresi reguler menggantikan urutan yang berisi tanda hubung tunggal dan sebaliknya tidak ada tanda hubung, titik dua, atau garis miring (jadi, tepat sebelum tanda garis kedua, atau garis miring pertama atau titik dua).Jika Anda menggunakan * BSD (termasuk Mac OS) yang Anda butuhkan,
-i ''
bukan hanya-i
.Untuk pendekatan lain, Anda bisa memperbaiki pemetaan Anda ke
sed
skrip. Jika Anda memiliki fileincorrect_tags.txt
sepertimaka Anda dapat menjalankan skrip berikut
yang menghasilkan ...
sed
skrip lain yang sekarang terlihat sepertiyang dapat Anda berikan ke instance lain
sed
untuk memodifikasi file yang berisi token yang ingin Anda ganti.Pipa penuh kemudian adalah
dan lagi, Anda mungkin ingin mencoba tanpa
-i
terlebih dahulu untuk melihat seperti apa hasilnya. Juga, Andased
mungkin tidak menyukai-f
opsi ini, atau mungkin tidak mendukung membaca skrip pada input standar; mungkin kemudian cukup simpan output darised
doa pertama ke file sementara dan kemudian berikan nama file sementara sebagai argumen nama file-f
.Perhatikan bahwa ini membutuhkan tag untuk tidak tumpang tindih - jika Anda pertama kali mengganti A dengan B dan kemudian B dengan C, hasil akhirnya akan seperti jika Anda telah menentukan "A" "C". Solusinya adalah mengganti urutan sehingga B diganti dengan C terlebih dahulu, dan hanya kemudian A dengan B.
sumber