Eu tenho um arquivo que se parece com isso. Existem muitas linhas neste formato.
5/10 RED SYSID This is a long message
Gostaria que essas linhas estivessem em 4 colunas separadas por vírgula.
5/10,RED,SYSID,This is a long message
Como posso substituir apenas os três primeiros espaços por vírgulas?
Respostas:
0 para resposta № 1O seguinte regex deve fazer o que você deseja.
$line -replace "^(S+?) (S+?) (S+?) (.*)","$1,$2,$3,$4"
Isso captura quatro grupos de espaços não em brancocaracteres separados por espaços, com o último grupo contendo o restante da sequência. Em seguida, os substitui pelos mesmos quatro grupos separados por vírgulas.
Para usar isso para modificar todas as linhas correspondentes em um arquivo, Pipe Get-Content
através Foreach-Object
e finalmente para Out-File
$regex = [regex]"^(S+?) (S+?) (S+?) (.*)","$1,$2,$3,$4"
Get-Content $filename | foreach {
$_ -replace $regex
} | Out-File $newfilename
Quaisquer linhas que o regex não corresponda serão enviadaspara o arquivo de saída inalterado. Isso inclui se alguma linha contém guias em vez de espaços. Se você precisar testar isso em seu script, primeiro poderá testar $_ -match $regex
e tome as medidas apropriadas se isso retornar falso.
1 para resposta № 2
Você pode fazer isso com o PowerShell -split
e -join
operadores.
$line -split " ",3 -join ","
Este exemplo converterá os três primeiros espaços em vírgulas. -split " ",3
dividirá a sequência em uma matriz de quatro elementos separados pelos três primeiros espaços da sequência. Então -join ","
juntá-los-á em uma sequência com uma vírgula entre cada uma.
O item acima não funcionará se sua entrada tiver váriosespaços entre os campos, pois cada espaço é considerado separadamente ou se seus campos forem separados por outros espaços em branco, como tabulações. Em vez disso, use uma divisão de regex.
$line -split "s+",3,"RegexMatch" -join ","
Este exemplo trata como delimitador as três primeiras correspondências de s+
e converte uma sequência de espaços em branco consecutivos em uma única vírgula.
Para executar em todas as linhas de um arquivo, use Get-Content
e Foreach-Object
Get-Content $filename | foreach {
$_ -split "s+",3,"RegexMatch" -join ","
} | Out-File $newfilename
0 para resposta № 3
Pode ser o que você está procurando.
Substitua a primeira ocorrência de uma sequência em um arquivo
O código relevante é este:
$re = [regex]" "
$re.Replace([string]::Join("`n", (gc C:PathTotest.txt)), ",", 3)