Замена / вставка новых строк с помощью Powershell - PullRequest
0 голосов
/ 30 июня 2019

(у меня есть читать другие темы с похожими именами ...)

Я новичок в PowerShell.Я пытаюсь понять, как найти и заменить новые строки.Например, найдите двойные символы новой строки и замените их одинарными или наоборот.

У меня есть тестовый документ, созданный с помощью Блокнота:

The quick brown fox jumped over the lazy dog
The quick brown fox jumped over the lazy dog

The quick brown fox jumped over the lazy dog
The quick brown fox jumped over the lazy dog

Я работаю в PowerShell ISE длятестирование / обучение.

Когда я запускаю следующую команду (пытаюсь заменить одну новую строку двумя):

((Get-Content -path $filename -raw) -replace '`n','`n`n') | Set-Content -path $filename
Get-Content -path $filename -raw

Вывод остается неизменным.Поэтому я попробовал следующее, и оно осталось без изменений.

((Get-Content -path $filename -raw) -replace '`r`n','`r`n`r`n') | Set-Content -path $filename

Итак, зная, что PowerShell использует обратную галочку, а не обратную косую черту, но из-за разочарования я попробовал следующую команду:

((Get-Content -path $filename -raw) -replace '\n','\n\n') | Set-Content -path $filename

И, к удивлению (для меня), все символы новой строки были заменены, но строковым литералом '\ n \ n'.Таким образом, кажется, что поиск новой строки работает с обратной косой чертой, но не с обратной галочкой.Замена, к сожалению, была буквальной строкой, а не CRLF, который мне нужен.

Я в тупике.Но что бы это ни стоило, я также попробовал следующее, и строковый литерал снова использовался для замены (т. Е. Вместо новых строк в документе содержался '`r`n').

((Get-Content -path $filename -raw) -replace '\n','`r`n') | Set-Content -path $filename

Iвидел много сообщений, где люди по ошибке использовали обратную косую черту, но в моем случае кажется, что для поиска требуется обратная косая черта, и я не понимаю, что требуется для замены новой строки.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

'`n' просто соответствует буквальным символам [backtick] [n], а это не то, что вам нужно. Вы хотите интерпретировать эти значения. Для этого вам нужно использовать двойные кавычки, т.е. '`n' должно быть "`n". По словам Microsoft ...

Специальные символы в PowerShell начинаются с обратной черты характер, также известный как серьезный акцент (ASCII 96). ... эти символы чувствительны к регистру. Только побег персонаж интерпретируется при использовании в двойных кавычках (").

1 голос
/ 01 июля 2019

Есть несколько способов сделать это. Сначала нужно прочитать файл как одну строку и выполнить с ним регулярное выражение -replace: Помните, что на машинах Windows символ новой строки представляет собой комбинацию из двух символов CR ('\r', значение ASCII 13) и LF ('\n', значение ASCII 10).

$filename = 'D:\test.txt'

# replace single newlines by a double newline
$replaceWith = '{0}{0}' -f [Environment]::NewLine
(Get-Content -Path $filename -Raw) -replace '\r?\n', $replaceWith | Set-Content -Path 'D:\test-to-double.txt' -Force

# replace double newlines by a single newline
$replaceWith = [Environment]::NewLine
(Get-Content -Path $filename -Raw) -replace '(\r?\n){2}', $replaceWith | Set-Content -Path 'D:\test-to-single.txt' -Force

Другой способ - прочитать файл как строковый массив (пусть PowerShell работает с отдельными символами новой строки):

# read the file as string array and join the elements with a double newline
$replaceWith = '{0}{0}' -f [Environment]::NewLine
(Get-Content -Path $filename) -join $replaceWith | Set-Content -Path 'D:\test-to-double.txt' -Force

# read the file as string array and join the elements with a single newline
$replaceWith = [Environment]::NewLine
(Get-Content -Path $filename) -join $replaceWith | Set-Content -Path 'D:\test-to-single.txt' -Force

Последний метод также чрезвычайно подходит для удаления пустых или только пробельных строк перед тем, как «нормализовать» новые строки в тексте: В этом случае просто замените (Get-Content -Path $filename) на (Get-Content -Path $filename | Where-Object { $_ -match '\S' })

1 голос
/ 01 июля 2019

Используйте двойные кавычки. Вы, вероятно, также хотите, чтобы параметр -nonewline был set-content, чтобы другой `r`n не помещался в конец файла.

PS> '`n'
`n
PS> "`n"



PS> (Get-Content -path $filename -raw) -replace "`n","`n`n" | 
      Set-Content -path $filename -nonewline
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...