As circunstâncias que levaram a essa solicitação não são muito importantes (leia-se: por favor, não me dê dicas sobre como evitar essa situação, já tentei), mas tenho um mecanismo que produz arquivos de texto. Por exemplo, esses arquivos normalmente se parecem com isso:
ENTRY: XYZ
COMMENT: This is a comment
ENTRY: 123
INTEGER: 4
Às vezes, no entanto, os dados que processamos contêm quebras de linha, então os arquivos de texto ficam assim:
ENTRY: XYZ
COMMENT: This is a comment
that spans over multiple lines
just to make life difficult
ENTRY: 123
O que estou procurando é algum PowerShell que possa processar um arquivo de texto inteiro e dizer: "para linhas que não contêm um :
caractere, faça esta linha parte da linha antes dela, possivelmente substituindo a quebra por ::
ou algo para deixar claro". O resultado final procurado seria:
ENTRY: XYZ
COMMENT: This is a comment :: that spans over multiple lines :: just to make life difficult
ENTRY: 123
Até agora tenho usado get-content | % {$_ etc}
, mas % divide as coisas em linhas individuais. Eu não acredito %
ou ?
tenho qualquer noção de contexto, então não será possível dizer where object match xyz make it part of the last object
.
Passei muito tempo tentando usar números de linha. Meu pseudocódigo era while the document contains lines that do not contain a colon, get the line number of the first line not containing a colon and set the previous line number to contain both its data and the data of the offending line
; no entanto, a ação anterior alteraria o número de linhas, o que significa que toda vez que eu fizesse esse ajuste, precisaria recalcular os números das linhas individuais. Acrescente a isso que "enquanto o documento contém linhas que não começam com dois pontos" pode ser um processo muito intensivo do sistema (esses documentos podem ser muito grandes) e é uma receita para o desastre.
Aqui está um exemplo de uma solução baseada em regex:
Primeiro você carrega o arquivo inteiro com
-Raw
flag. Em seguida, o regex corresponde a uma nova linha (\n
), caracteres que não são nova linha ou:
capturados em um grupo([^\n:]+)
e, por último, temos uma previsão positiva de uma nova linha(?=\n)
que garante uma parada nela, mas a ignora para a correspondência completa, para que a próxima\n
seja correspondida para a próxima linha. Em seguida, temos uma substituição adequada usando o grupo capturado e a enviamos para o mesmo arquivo.