Powershell 正则表达式匹配序列不起作用,尽管它在 Sublime Text 查找和替换中匹配

Powershell regex match sequence doesn't work although it matches in Sublime Text find and replace

我正在尝试创建一个 Powershell 正则表达式语句,以从已使用 Powershell 正则表达式修改的 git diff 文件中删除此输出的前五行。

[1mdiff --git a/uk1.adoc b/uk2.adoc</span>+++
[1mindex b5d3bf7..90299b8 100644</span>+++
[1m--- a/uk1.adoc</span>+++
[1m+++ b/uk2.adoc</span>+++
[36m@@ -1,9 +1,9 @@</span>+++
= Heading

Body text

显示图片是因为文本中未显示二进制代码

以下语句与文本匹配,因此如果我不替换任何内容,“= 标题”行将位于页面顶部。

^[^=]*.[+][\n]

但在 Powershell 中,它与文本不匹配。

Get-Content "result2.adoc" | % { $_  -Replace '^[^=]*.[+][\n]', '' } | Out-File  "result3.adoc";

关于为什么它在 Powershell 中不起作用的任何想法?

我的总体目标是创建一个 AsciiDoc 文件的两个版本的差异文件,然后用 HTML/CSS 代码替换 ASCII 代码,以显示生成的 AsciiDoc 文件,其中包含 green/red 跟踪更改。

最简单且更快的方法是将输入文件读取为 单行、多行 字符串 Get-Content -Raw 并将正则表达式传递给 -replace 跨多行操作:

(Get-Content -Raw result2.adoc) -replace '(?s)^.+?\n(?==)' |
  Set-Content result3.adoc
  • (?s) 激活行内选项 s 这使得 . 也匹配换行符 (\n)。

  • ^.+?\n(?==) 从字符串开头匹配 (^) 任意数量的字符(包括换行符)(.+),非贪婪匹配 (?)

  • 直到找到换行符 (\n) 后跟 =

    • (?=...) 是一个前瞻断言,它匹配 = 而不 消耗 它,即不考虑它是匹配的子字符串的一部分。

由于没有替换操作数传递给 -replace,整个匹配被替换为隐含的 空字符串 ,即匹配的实际上是 删除.


至于你试过的

如果未找到匹配项,-replace 运算符将其 LHS 传递到 ,因此您不能使用它来 过滤掉 不匹配的行。

即使您完全匹配不需要的行并将其替换为 ''(空字符串),它也会在输出中显示为 空行当发送到 Set-ContentOut-File (>).

至于您的特定正则表达式,^[^=]*.[+][\n](第一个 ^ 后跟一个 ESC (0x1b) 字符。):

  • [\n](仅 \n 就足够了)尝试匹配换行符。在文字 + ([+]) 之后,但是根据定义,用 Get-Content (没有 -Raw)单独读取的行是 剥离的 尾随换行符,因此 \n 永远不会匹配;相反,使用 $ 来匹配行尾。

您可以使用 ?Where-Object cmdlet 的内置别名)而不是 %ForEach-Object cmdlet 的内置别名) ) 执行所需的过滤:

Get-Content result2.adoc | ? { $_ -notmatch '^\e\[' }

$_ -notmatch '^\e[' returns $True 仅适用于不以 ESC 字符(\e 开始(^)的行,其代码点是0x1b) 后跟文字 (\) [,从而有效地过滤掉 = Heading 行之前的行。

但是,顶部的多行 -replace 命令可以更直接、更快速地表达您的意图。

这是在@mklement0 的帮助下我最终得到的代码。此 Powershell 脚本为 AsciiDoc 文件的两个版本创建 MS Word-style 跟踪更改。它创建 Diff 文件,使用正则表达式将 ASCII 代码替换为 HTML/CSS 标记,删除 Diff header(谢谢!),使用 AsciiDoctor 创建一个 HTML 文件,然后使用 PrinceXML 创建我可以发送给文档审阅者的输出的 PDF 文件。

    git diff --color-words file1.adoc file2.adoc > result.adoc;
Get-Content "result.adoc" | % {
$_  -Replace '(=+ ?)([A-Za-z\s]+)(\[m)', '' `
    -Replace '\[32m', '+++<span style="color: #00cd00;">' `
    -Replace '\[31m', '+++<span style="color: #cd0000; text-decoration: line-through;">' `
    -Replace '\[m', '</span>+++' } | Out-File -encoding utf8 "result2.adoc" ;
(Get-Content -Raw result2.adoc) -replace '(?s)^.+?\n(?==)', '' | Out-File -encoding utf8 "result3.adoc" ;
asciidoctor result3.adoc -o result3.html;
prince result3.html --javascript -o result3.pdf;
Read-Host -Prompt "Press Enter to exit"

这是使用维基百科中的一些文本的结果截图: