/ / PowerShell substitui os três primeiros espaços por vírgulas - windows, powershell

PowerShell substitui os três primeiros espaços por vírgulas - windows, powershell

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 № 1

O 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 $regexe 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)