2

Как я могу найти и сопоставить только текст (буквы) , которые в верхнем регистре, перед двоеточием : и заменить его с одним названием ("MyName")?

Я также хочу , чтобы сделать цвет текста, но я не знаю , как добавить для всех прописных (букв) , а затем двоеточие : только эту цветовую схему, без изменения имени абонента.

Пример:

MIKE: - Go to school!

VICTORIA: Yes, I go right now.

в

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

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

2 ответа2

2

Решение PowerShell:

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

Быстрое объяснение:

  • Get-Content извлекает содержимое указанного файла. Символ канала (|) передает результат следующей команде.
  • ForEach-Object циклически перебирает содержимое файла, и для каждой строки (представленной $_) текст, заданный в качестве первого параметра, заменяется текстом, заданным в качестве второго параметра. [A-Z]+: регулярное выражение, ищущее одну или несколько (+) заглавных букв ([A-Z]), за которыми следует двоеточие. -CReplace используется для поиска с учетом регистра, потому что регулярные выражения в PowerShell по умолчанию не чувствительны к регистру.
  • Set-Content является противоположностью Get-Content , записывая ввод обратно в данный файл.

Я делю код на несколько строк для удобства чтения, но вы можете написать все это в одну строку. Используя псевдонимы, вы можете даже значительно сократить его:

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

Если вы хотите изменить каждое совпадение, а не заменить его фиксированным текстом, попробуйте следующее:

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

Обратите внимание на два изменения по сравнению с предыдущей версией:

  • Регулярное выражение [A-Z]+: заключено в круглые скобки. Это создает обратную ссылку, которую мы позже обозначим в тексте замены как $1 . Таким образом вы сохраняете текст, который искали в результате, а не заменяете его.
  • Одинарные кавычки вокруг текста замены. Если вы используете двойные кавычки, PowerShell попытается интерпретировать $1 как переменную, которая не существует, и не выдаст ничего там, где вы ожидаете, что имя будет. Кроме того, одинарные кавычки удобны, когда текст содержит двойные кавычки (как в случае с HTML), потому что вам не нужно экранировать каждую двойную кавычку с помощью обратной черты.
0

Вы можете использовать ответ Индрекса, модифицированный как

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

или лучше

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

а затем добавить в свой CSS

  span.name { color:#800080; }

Не проверенный, вам может понадобиться использовать \ для "экранирования" символов, которые являются зарезервированными символами в powershell.

Powershell - хороший выбор, потому что он почти наверняка уже есть на вашем компьютере с Windows.

У меня нет стимула изучать Powershell, потому что он очень прост в установке Perl (и / или файловых утилит GNU, включая sed awk grep и т.д.)

Использование Perl решение будет что-то вроде

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

(Я нахожу это проще, чем powershell, но я предвзятый)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .