Tìm và ghép các từ in hoa theo sau là dấu hai chấm


2

Làm cách nào tôi có thể tìm và khớp chỉ văn bản (chữ cái) viết hoa, trước dấu hai chấm (theo sau là : ) và thay thế nó bằng một tên duy nhất ("MyName")?

Tôi cũng muốn tạo một văn bản màu, nhưng tôi không biết cách thêm cho tất cả chữ hoa (chữ cái) theo sau là dấu hai chấm ( : ) chỉ phối màu này, mà không sửa đổi tên người.

Thí dụ:

MIKE: - Go to school!

VICTORIA: Yes, I go right now.

đến

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

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

Câu trả lời:


2

Giải pháp PowerShell:

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

Giải thích nhanh:

  • Get-Content lấy nội dung của tập tin được chỉ định Nhân vật tẩu ( | ) chuyển kết quả cho lệnh tiếp theo.
  • ForEach-Object các vòng lặp trên từng dòng nội dung của tệp và cho từng dòng (được biểu thị bằng $_ ) thay thế văn bản được cung cấp làm tham số đầu tiên bằng văn bản được cung cấp làm tham số thứ hai. [A-Z]+: là một biểu hiện thông thường , tìm kiếm một hoặc nhiều ( + ) chữ in hoa ( [A-Z] ) theo sau là dấu hai chấm. -CReplace được sử dụng để tìm kiếm phân biệt chữ hoa chữ thường, vì các biểu thức thông thường trong PowerShell không phân biệt chữ hoa chữ thường.
  • Set-Content trái ngược với Get-Content, ghi đầu vào trở lại tập tin đã cho.

Tôi chia mã thành nhiều dòng để dễ đọc, nhưng bạn có thể viết tất cả trên một dòng. Sử dụng bí danh bạn thậm chí có thể rút ngắn đáng kể:

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

Nếu bạn muốn thực sự sửa đổi từng trận đấu, thay vì thay thế nó bằng một văn bản cố định, thì hãy thử các cách sau:

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

Lưu ý hai thay đổi so với phiên bản trước:

  • Biểu thức chính quy [A-Z]+: được bao quanh bởi dấu ngoặc đơn. Điều này tạo ra một phản ứng ngược , mà sau này chúng ta đề cập đến trong văn bản thay thế là $1. Đây là cách bạn giữ văn bản bạn đang tìm kiếm trong kết quả, thay vì thay thế nó.
  • Dấu ngoặc đơn xung quanh văn bản thay thế. Nếu bạn đã sử dụng dấu ngoặc kép, PowerShell sẽ cố gắng diễn giải $1 như một biến, không tồn tại và sẽ không trả về bất cứ nơi nào bạn mong đợi tên đó. Ngoài ra, dấu ngoặc đơn rất hữu ích khi văn bản chứa dấu ngoặc kép (như trường hợp với HTML), vì bạn không phải thoát từng trích dẫn kép bằng một dấu gạch chéo.

Cảm ơn rất nhiều! Nhưng nếu tôi muốn tạo một văn bản màu, làm thế nào để thêm cho tất cả UPPERCASE (chữ cái) theo sau (':') chỉ phối màu này. Ví dụ: "MIKE: - Đi học!" "& lt; font color =" # 800080 "& gt; MIKE: & lt; / font & gt; - Đi học!"
cipry

@cipry Xem câu trả lời cập nhật.
Indrek

@cipry Bạn được chào đón. Đừng ngại đưa ra câu trả lời nếu nó giúp bạn và đánh dấu nó là được chấp nhận (bằng cách nhấp vào dấu kiểm màu xanh bên cạnh nó) nếu nó giải quyết được vấn đề của bạn.
Indrek

Có bài đăng cập nhật của bạn giúp tôi rất nhiều. Tôi hiểu cách thức hoạt động của nó: Tôi tạo một tệp txt bằng mã của bạn, tôi đổi tên thành .ps1 sau đó tôi chạy nó với quản trị viên ngay, nhưng tôi không gặp lỗi. viết trong một cửa sổ cmd "set-execpolicy từ xa" và sau đó tất cả đều hoạt động tốt.
cipry

@cipry Có, theo mặc định, PowerShell chỉ cho phép chạy các lệnh trực tiếp trong dấu nhắc PS. Lệnh bạn đã nhập cho phép chạy các tệp tập lệnh PS, nhưng cũng yêu cầu các tệp được tải xuống từ Internet phải được ký. Đó là một sự thỏa hiệp hợp lý giữa mặc định hạn chế và cho phép hoàn toàn tất cả mã để chạy.
Indrek

0

Bạn có thể sử dụng câu trả lời Indreks được sửa đổi như

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

hoặc tốt hơn

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

và sau đó thêm vào CSS của bạn

  span.name { color:#800080; }

Chưa được kiểm tra, bạn có thể cần phải sử dụng \ để "thoát" các nhân vật được dành riêng cho các nhân vật trong powershell.

Powershell là một lựa chọn tốt vì bạn gần như chắc chắn đã có nó trên máy tính Windows của mình.

Tôi không có động lực để tìm hiểu Powershell vì việc cài đặt Perl (và / hoặc các tập tin GNU bao gồm cả sed awk grep, v.v.) rất dễ dàng.

Sử dụng perl giải pháp sẽ giống như

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

(Tôi thấy điều này đơn giản hơn powershell nhưng tôi thiên vị)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.