Powershell заменяет потерянные разрывы строк

Я новичок в PowerShell. У меня есть простой скрипт powershell, который просто заменяет текст, но я обнаружил, что регулярное выражение заменяет мой многострочный источник данных в однострочный текст при выводе. Я хочу, чтобы разрывы строк были сохранены. Вот глупая версия сценария.

$source=(Get-Content textfile.txt)

$process1 = [regex]::Replace($source, "line", "line2")

$process1 | out-file -encoding ascii textfile2.txt

Вы можете создать тестовый файл, вызывающий textfile.txt, с такими простыми строками, чтобы проверить его

line 
line
Some line
More line here

Я что-то упустил очевидное?

Спасибо фадриан

1 ответ

Решение

Ваша проблема здесь в том, что Get-Content возвращает string[](с одним элементом для каждой строки в исходном файле) [regex]::Replace ожидает строку. Вот почему массив сначала будет преобразован в строку, что означает просто объединение всех элементов.

PowerShell обеспечивает -replace оператор, который будет обрабатывать этот случай более изящно:

(Get-Content .\textfile.txt) -replace 'line', 'line2' | 
   out-file -encoding ascii textfile2.txt

-replace Оператор работает с каждым элементом массива индивидуально, если он применяется к массиву.

И да, он делает совпадения регулярных выражений и заменяет их. Например:

> (Get-Content .\textfile.txt) -replace '(i|o|u)', '$1$1'
liinee
liinee
Soomee liinee
Mooree liinee heeree

Читайте немного больше здесь и здесь.

Другие вопросы по тегам