Encontre e combine palavras em maiúsculas seguidas de dois pontos (“:”)

2

Como posso encontrar e corresponder apenas texto (letras) em maiúscula, antes de dois-pontos (seguido de : ) e substituí-lo por um único nome ("MyName")?

Eu também quero fazer um texto colorido, mas não sei como adicionar todas as maiúsculas (letras) seguidas por dois pontos ( : ) somente este esquema de cores, sem modificar o nome da pessoa.

Exemplo:

MIKE: - Go to school!

VICTORIA: Yes, I go right now.

para

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

< font color="#800080">VICTORIA:</font> Yes, I go right now.
    
por cipry 13.10.2012 / 11:08

2 respostas

2

Solução do PowerShell:

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

Explicação rápida:

  • Get-Content recupera o conteúdo do arquivo especificado. O caractere de pipe ( | ) passa o resultado para o próximo comando.
  • ForEach-Object faz um loop sobre o conteúdo do arquivo linha por linha e para cada linha (representada por $_ ) substitui o texto dado como o primeiro parâmetro com o texto dado como o segundo parâmetro. [A-Z]+: é uma expressão regular , procurando por uma ou mais ( + ) letras maiúsculas ( [A-Z] ) seguidas por uma cólon. -CReplace é usado para pesquisa com diferenciação de maiúsculas e minúsculas, porque as expressões regulares no PowerShell não diferenciam maiúsculas de minúsculas por padrão.
  • Set-Content é o oposto de Get-Content , gravando a entrada de volta no arquivo fornecido.

Eu divido o código em várias linhas para facilitar a leitura, mas você pode escrever tudo em uma linha. Usando aliases , você pode até diminuí-lo consideravelmente:

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

Se você quiser realmente modificar cada correspondência, em vez de substituí-la por um texto fixo, tente o seguinte:

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

Observe duas alterações da versão anterior:

  • A expressão regular [A-Z]+: está entre parênteses. Isso cria uma referência anterior , à qual mais tarde nos referimos no texto de substituição como $1 . É assim que você mantém o texto que estava procurando no resultado, em vez de substituí-lo.
  • Aspas simples ao redor do texto de substituição. Se você usasse aspas duplas, o PowerShell tentaria interpretar o $1 como uma variável, que não existe e não retornaria nada onde você esperaria que o nome fosse. Além disso, as aspas simples são úteis quando o texto contém aspas duplas (como é o caso do HTML), porque você não precisa escapar de cada aspas duplas com um backtick.
por 13.10.2012 / 11:15
0

Você pode usar a resposta Indreks modificada como

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

ou melhor

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

e, em seguida, adicione ao seu CSS

  span.name { color:#800080; }

Não testado, você pode precisar usar \ para "escapar" caracteres que são caracteres reservados no powershell.

O Powershell é uma boa escolha, porque você quase certamente já o possui em seu computador Windows.

Eu não tenho incentivo para aprender o Powershell porque é tão fácil instalar o Perl (e / ou os utilitários de arquivos GNU, incluindo o sed awk grep etc)

Usando perl, a solução seria algo como

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

(acho isso mais simples que o powershell, mas sou parcial)

    
por 13.10.2012 / 12:32

Tags