Tetapkan nilai ke variabel dari file teks. Cari string dalam file. Ganti string dalam file?

0

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 ->

  1. 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.
  2. 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.

Gadhvi
sumber
Apakah yang Anda coba lakukan hanyalah mengambil setiap file (mis. Main_Overview / Ballast / BA-04) dan melakukan pencarian dan mengganti BA-02-2 -> BA-04 dalam file itu?
davidgo
Anda bermaksud mengatakan bahwa Main_Overview / Ballast / BA-03: Tag = BA-02-1 harus ditulis ulang seperti, Main_Overview / Ballast / BA-03: Tag = BA-03 dan lainnya harus, Main_Overview / Ballast / BA- 04: Tag = BA-04?
Rajesh S
@davigo Saya hanya perlu mengganti semua nama tag yang salah yang ada di file lain yang telah saya sebutkan sekarang, karena saya harus terlebih dahulu tahu mana yang salah dan apa nama yang tepat benar. Saya telah membuat file teks yang disebutkan di blok kedua yang berisi nama tag lama pertama dan kemudian nama tag baru.
gadhvi

Jawaban:

1

Apakah Anda hanya mencari ini?

sed -i '\%/\([^/:]*\):Tag=\1%n;s%%/\(\([^/:]*\):Tag=\)[^/:-]*-[^/:-]*%\1\2%' *.j1

(Coba tanpa -imelihat output tanpa menulis kembali ke file asli - pipa lesssehingga 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 setelahnya Tag=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 sedskrip. Jika Anda memiliki file incorrect_tags.txtseperti

"BA-02-1" "BA-03"
"BA-02-2" "BA-04"

maka Anda dapat menjalankan skrip berikut

sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt

yang menghasilkan ... sedskrip lain yang sekarang terlihat seperti

s/BA-02-1/BA-03/g
s/BA-02-2/BA-04/g

yang dapat Anda berikan ke instance lain seduntuk memodifikasi file yang berisi token yang ingin Anda ganti.

Pipa penuh kemudian adalah

sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt |
sed -i -f - *.j1

dan lagi, Anda mungkin ingin mencoba tanpa -iterlebih dahulu untuk melihat seperti apa hasilnya. Juga, Anda sedmungkin tidak menyukai -fopsi ini, atau mungkin tidak mendukung membaca skrip pada input standar; mungkin kemudian cukup simpan output dari seddoa 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.

tripleee
sumber
Terima kasih tetapi saya sudah melakukan bagian ini menggunakan C, bagian terakhir yang tersisa adalah saya harus mengganti nama tag yang salah lama dengan yang baru tetapi file-file itu berbeda saya sebutkan sekarang dan ada hampir 2k file.
gadhvi
Lihat pembaruan sekarang. Menggunakan C untuk hal-hal semacam ini mungkin salah arah tetapi jika Anda sudah melakukan itu, Anda sebaiknya menggunakan hasilnya.
tripleee
terima kasih banyak, saya tidak pernah berpikir sed sangat kuat saya perlu belajar lebih banyak tentang itu.
gadhvi