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 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
$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.