Power Shell, как относиться к \ n как буквальный regunescape - PullRequest
0 голосов
/ 03 мая 2020

Я не экранировал некоторые строки с помощью Power Shell и столкнулся с небольшой проблемой. Как я могу удалить строки, рассматривая \ n как литерал.

например

$str = "\n\n\u041c\n\u0435";

[regex]::Unescape($str)

результат:

newline
newline
M
E

ожидаемый результат

\n\nM\ne

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Хотя iRon's ответ самый простой, я думаю, вы можете использовать вспомогательную функцию, чтобы просто заменить литералы Unicode в строке.

Что-то вроде:

function Convert-UnicodeLiterals {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Mandatory = $true, Position = 0)]
        [string]$Text    
    )
    $regex = [regex] '(?i)\\u[0-9a-f]{4}'
    $match = $regex.Match($Text)
    while ($match.Success) {
        $codePoint = [int]($match.Value -replace '^\\u', '0x')
        $Text = $Text.Replace($match.Value, [string][char]::ConvertFromUtf32($codePoint))
        $match = $match.NextMatch()
    } 

    $Text
}

$str = "\n\n\u041c\n\u0435" | Convert-UnicodeLiterals

Результат:

\n\nМ\nе
1 голос
/ 03 мая 2020

Поскольку вы не можете исключить что-либо из метода Unescape, я бы просто позволил ему убрать все с экранирования и вернуть буквальные переводы строк назад:

[regex]::Unescape($str).Replace("`n", '\n')
...