Solução do PowerShell:
Get-Content "file.txt" |
ForEach-Object { $_ -CReplace "[A-Z]+:", "MyName" } |
Set-Content "file.txt"
Explicação rápida:
-
Get-Contentrecupera o conteúdo do arquivo especificado. O caractere de pipe (|) passa o resultado para o próximo comando. -
ForEach-Objectfaz 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 deGet-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
$1como 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.