regex 在PowerShell中正确格式化Reddit代码块

mcdcgff0  于 2023-04-13  发布在  Shell
关注(0)|答案(1)|浏览(109)

所以我一直在学习PowerShell,我有时会在Reddit的PowerShell论坛上提问,但人们经常抱怨我的帖子质量(缺乏代码块)。
我真的很喜欢这个论坛,我从阅读帖子中学到了很多东西,但我有时也想发帖并提出问题,所以我努力编写了一个PowerShell程序,它将以markdown文件作为输入,并按照Reddit期望的方式正确格式化代码块。
程序应该使用-replace操作符,删除反引号并在每行前加上四个空格(\s)。所以如果我有一个InputExample.txt,看起来像这样:

xxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxx`
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
...
Get-Childitem -Path 'c:\temp\test.ps1'
Get-Childitem -Path 'c:\temp\test.ps1'
Get-Childitem -Path 'c:\temp\test.ps1'
...
xxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxx`
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...
MouseGetPos, Xpos, Ypos
WinWait, %Window%
WinGetPos,,, Width, Height
MouseGetPos, X, Y
...
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
xxxxxxxxxx
...
Hello := "Hello World"
Test := Hello ~= "Hello" ? "Yes, Match!" (Word_Count := 2) : "No Match!"
OutputDebug, % "Test : "Test
OutputDebug, % "Word count is : "Word_Count
...
xxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxx`
...
Test : Yes, Match!2
Word count is : 2
...
xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx
`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`

请将...解释为三个反引号,我不完全理解如何在Markdown中转义它们。

xxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxx`
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`

    Get-Childitem -Path 'c:\temp\test.ps1'
    Get-Childitem -Path 'c:\temp\test.ps1'
    Get-Childitem -Path 'c:\temp\test.ps1'

xxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxx`
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    MouseGetPos, Xpos, Ypos
    WinWait, %Window%
    WinGetPos,,, Width, Height
    MouseGetPos, X, Y

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
xxxxxxxxxx

    Hello := "Hello World"
    Test := Hello ~= "Hello" ? "Yes, Match!" (Word_Count := 2) : "No Match!"
    OutputDebug, % "Test : "Test
    OutputDebug, % "Word count is : "Word_Count

xxxxxxxxxxxxxxxxxxxxxxxxx
`xxxxxxxxxx`

    Test : Yes, Match!2
    Word count is : 2

xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx
`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`

我的RegEx知识并不比我的PowerShell知识强多少,我试过:

$Myvar = Get-Content -path '.\InputExample.txt' -Raw
#`$Myvar -replace "^```\n..*````"            # Will not execute no matter what I try :/
`$Myvar -replace "^```\n(.*)```", "$1"       # Same issue as above
$Myvar -replace '`{3}(\r?\n)', '    $1    '  # This partially works

我在最后一次尝试中已经足够接近了,我设法选择了`````中的所有代码(包括反引号本身),但是尝试在每行前面加上一个带有' $1 '的退格符并没有达到我的预期。
有人能帮我吗?谢谢。

nbnkbykc

nbnkbykc1#

您可能会发现使用带有匹配求值器的正则表达式替换(也称为脚本块替换)更容易,基本上您可以让您的匹配求值器将捕获组1的每行开头替换为4个空格。
假设我们将提供的示例存储在变量$string中,并且我们使用-Raw开关读取文件内容:

$string = Get-Content path\to\file -Raw

在PowerShell 6+中,您可以执行以下操作:

$string -replace '(?ms)^`{3}(\r?\n.+?\r?\n)^`{3}', {
    $_.Groups[1].Value -replace '(?m)^', '    '
}

在Windows PowerShell 5.1中,您需要直接调用API:

[regex]::Replace($string, '(?ms)^`{3}(\r?\n.+?\r?\n)^`{3}', {
    $args[0].Groups[1].Value -replace '(?m)^', '    ' })

相关问题