Temukan & cocokkan kata-kata dalam huruf besar diikuti dengan titik dua (":")

2

Bagaimana saya bisa menemukan dan mencocokkan hanya teks (huruf) yang dalam huruf besar, sebelum titik dua (diikuti oleh : ) dan ganti dengan satu nama ("MyName")?

Saya juga ingin membuat teks warna, tetapi saya tidak tahu bagaimana menambahkan untuk semua huruf besar (huruf) diikuti dengan tanda titik dua (titik dua) : ) hanya skema warna ini, tanpa mengubah nama orang.

Contoh:

MIKE: - Go to school!

VICTORIA: Yes, I go right now.

untuk

< font color="#800080">MIKE:</font> - Go to school!

< font color="#800080">VICTORIA:</font> Yes, I go right now.
cipry
sumber

Jawaban:

2

Solusi PowerShell:

Get-Content "file.txt" |
ForEach-Object { $_ -CReplace "[A-Z]+:", "MyName" } |
Set-Content "file.txt"

Penjelasan cepat:

  • Get-Content mengambil konten file yang ditentukan. Karakter pipa ( | ) meneruskan hasilnya ke perintah selanjutnya.
  • ForEach-Object loop atas isi file baris demi baris, dan untuk setiap baris (diwakili oleh $_ ) menggantikan teks yang diberikan sebagai parameter pertama dengan teks yang diberikan sebagai parameter kedua. [A-Z]+: adalah ekspresi reguler , mencari satu atau lebih ( + ) huruf besar ( [A-Z] ) diikuti oleh titik dua. -CReplace digunakan untuk pencarian case sensitif, karena ekspresi reguler di PowerShell tidak sensitif huruf secara default.
  • Set-Content adalah kebalikan dari Get-Content, menulis input kembali ke file yang diberikan.

Saya membagi kode hingga beberapa baris untuk dibaca, tetapi Anda dapat menulis semuanya dalam satu baris. Menggunakan alias Anda bahkan dapat mempersingkatnya:

gc "file.txt" | % { $_ -creplace "[A-Z]+:", "MyName" } | sc "file.txt"

Jika Anda ingin benar-benar memodifikasi setiap kecocokan, alih-alih menggantinya dengan teks yang tetap, cobalah yang berikut:

Get-Content "file.txt" |
ForEach-Object { $_ -CReplace "([A-Z]+:)", '<font color="#800080">$1</font>' } |
Set-Content "file.txt"

Perhatikan dua perubahan dari versi sebelumnya:

  • Ekspresi reguler [A-Z]+: dikelilingi oleh tanda kurung. Ini menciptakan a referensi kembali , yang kemudian kami sebut dalam teks pengganti sebagai $1. Ini adalah cara Anda menyimpan teks yang Anda cari di hasilnya, bukan menggantikannya.
  • Kutipan tunggal di sekitar teks pengganti. Jika Anda menggunakan tanda kutip ganda, PowerShell akan mencoba menafsirkan $1 sebagai variabel, yang tidak ada, dan tidak akan mengembalikan apa pun di tempat yang Anda harapkan. Juga, tanda kutip tunggal berguna ketika teks berisi tanda kutip ganda (seperti halnya dengan HTML), karena Anda tidak harus melarikan diri dari setiap kutipan ganda dengan backtick.
Indrek
sumber
Terima kasih banyak! Tetapi jika saya ingin membuat teks warna, cara menambahkan untuk semua UPPERCASE (huruf) diikuti oleh (':') hanya skema warna ini. Misalnya: "MIKE: - Pergi ke sekolah!" "& lt; font color =" # 800080 "& gt; MIKE: & lt; / font & gt; - Pergi ke sekolah!"
cipry
@cipry Lihat jawaban yang diperbarui.
Indrek
@cipry Sama-sama. Jangan ragu untuk memutakhirkan jawaban jika itu membantu Anda, dan menandainya sebagai diterima (dengan mengklik tanda centang hijau di sebelahnya) jika itu memecahkan masalah Anda.
Indrek
Ya posting Anda yang diperbarui banyak membantu saya. Saya pikir cara kerjanya: Saya membuat file txt dengan kode Anda, saya mengganti nama menjadi .ps1 lalu saya menjalankannya dengan admin dengan benar, tetapi saya mendapatkan kesalahan. tulis di jendela cmd "set-executpolicy remotesigned" dan kemudian semuanya bekerja dengan baik.
cipry
@cipry Ya, secara default PowerShell hanya mengizinkan menjalankan perintah langsung di prompt PS. Perintah yang Anda ketikkan memungkinkan menjalankan file skrip PS, tetapi juga mengharuskan file yang diunduh dari Internet untuk ditandatangani. Ini adalah kompromi yang masuk akal antara standar yang ketat dan mengizinkan sepenuhnya semua kode untuk dijalankan.
Indrek
0

Anda dapat menggunakan jawaban Indreks yang dimodifikasi sebagai

  -replace "([A-Z]:)", "<font color='#800080'>$1</font>"

atau lebih baik

  -replace "([A-Z]:)", "<span class='name'>$1</span>"

lalu tambahkan ke CSS Anda

  span.name { color:#800080; }

Belum diuji, Anda mungkin perlu menggunakan \ untuk "melarikan diri" karakter yang disediakan karakter dalam PowerShell.

Powershell adalah pilihan yang baik karena Anda hampir pasti sudah memilikinya di komputer Windows.

Saya tidak punya insentif untuk mempelajari Powershell karena sangat mudah untuk menginstal Perl (dan / atau utilitas file GNU termasuk sed awk grep dll)

Menggunakan perl solusinya akan menjadi sesuatu seperti

 perl -p -i -e 's/[A-Z]+:/<span class="name">$&</span>' f1.txt zz.txt b/c/*.txt

(Saya menemukan ini lebih sederhana dari PowerShell tapi saya bias)

RedGrittyBrick
sumber