2016-05-23 2 views
0

У меня есть очень большой файл журнала, который я хочу найти. Некоторые из длинных линий разворачиваются на две линии. Я хотел бы взять вторую строку этих строк и связать ее с предыдущей строкой, чтобы все они были на одной строке.Windows PowerShell Сделайте две строки одной строки

файл выглядит следующим образом:

05/10 some text 
05/10 some text 
05/10 some text 
05/10 some really long text that goes to 
the second line 
05/10 some text 
05/10 some text 
05/10 some really long text that goes to 
the second line 

Я хотел бы файл выглядеть следующим образом:

05/10 some text 
05/10 some text 
05/10 some text 
05/10 some really long text that goes to the second line 
05/10 some text 
05/10 some text 
05/10 some really long text that goes to the second line 
+2

'(Get-Content 'C: \ Temp \ file.txt' -raw) -replace«\ г \ п (?! \ d {2} \/\ d {2}) '| Set-Content 'c: \ temp \ newfile.txt'' –

+1

@AnthonyStringer Я собирался опубликовать ответ с тем же (даже не с одним символом) регулярным выражением, которое вы предоставили :-) –

ответ

0

Основа для этого достаточно просто. Итерации по строкам, выводимым по ходу движения, а когда нужно объединить, объедините их, прежде чем двигаться дальше.

$collector = $null 
@(switch -file $filename { 
    { isNewLine($_) } { 
    # Start of new line. 
    # Output the current collector, and reinitialize with the new line. 
    $collector 
    $collector = $_ 
    } 
    default { 
    # Continuation of previous line. Add current to collector. 
    $collector += $_ 
    } 
}, $collector) | Out-File $outputFile 

Хитрость в том, как определить функцию isNewLine. Например, если «хорошая» линия всегда начинается с текстом 05/10 вы можете использовать:

function isNewLine([string]$line) { 
    $line.startsWith('05/10') 
} 

Или в более общем случае, если она всегда начинается с датой формы MM/dd, вы можете использовать регулярные выражения.

function isNewLine([string]$line) { 
    $line -match '^\d{2}/\d{2}' 
} 

Структура немного отличается, если вам нужно проверить конец строки вместо начала. Например, если строка длиннее 80 символов объединяется со следующей строкой

$collector = $null 
@(switch -file $filename { 
    { $_.length -ge 80 } { 
    # Line continues on next. Save to collector 
    $collector += $_ 
    } 
    default { 
    # Line doesn't continue. Output it and clear collector 
    $collector + $_ 
    $collector = $null 
    } 
}, $collector) | Out-File $outputFile 
+0

Все хорошие строки начинаются с даты , поэтому я могу справиться с использованием 05 и так далее. Я попробую и дам вам знать, спасибо. – brotherchris

+0

Что я сделал не так, это, похоже, не вносит ничего в мой новый файл. 'Код $ имя_файла = 'File1.log' $ файл_вывода = 'file2.txt' функция isNewLine ([строка] $ строка) {$ line.startsWith ('05') } $ Коллектор = $ нулевой switch -file $ filename { {isNewLine ($ _)} { # Начало новой строки. # Вывод текущего коллектора и повторная инициализация с помощью новой строки. $ collector $ collector = $ _ } default { # Продолжение предыдущей строки. Добавить ток в коллекционер. $ collector + = $ _ } } $ collector | Out-File $ outputFile code' – brotherchris

+0

Похоже, я пропустил круглую скобку, необходимую для ее вывода в «Out-File». Поскольку я пытался добавить '$ collector' до конца, мне нужно обернуть весь переключатель в' @ (...) '. См. Исправление выше. –

Смежные вопросы