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

时间:2019-02-18 20:57:16

标签: regex git powershell sublimetext3 asciidoc

我正在尝试创建Powershell regex语句,以从已经用Powershell regex修改过的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

Image shown because binary code doesn't show in the text

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

以下语句与文本匹配,因此,如果我什么也没有替换,则将'= Heading'行放在页面顶部。

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

enter image description here

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

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

enter image description here

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

我的总体目标是创建一个包含两个版本的AsciiDoc文件的差异文件,然后将ASCII代码替换为HTML / CSS代码以显示生成的带有绿色/红色轨道变化的AsciiDoc文件。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

    • (?=...)是一个前瞻性断言,它与=匹配而没有使用,即不考虑它是匹配的子字符串的一部分。

因为没有替换操作数传递给-replace,所以整个匹配项都被隐含的空字符串替换,即匹配的内容被有效地删除了


关于您尝试过的事情

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

即使您完全匹配了不需要的行并将其替换为''(空字符串),当发送给{{时,它也会在输出中显示为空行。 1}}或Set-ContentOut-File)。

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

  • 0x1b(仅[\n]就足够了)尝试匹配换行符。在文字\n+)之后,但根据定义,用[+]单独读取的行(不包含Get-Content)被删除了 ,因此-Raw将永远不会匹配;而是使用\n来匹配行尾。

您可以使用$% cmdlet的内置别名)代替ForEach-Object? cmdlet的内置别名)来执行所需的过滤:

Where-Object

Get-Content result2.adoc | ? { $_ -notmatch '^\e\[' } 仅针对未以ESC字符($_ -notmatch '^\e[',其代码点为$True)开始的行(^)返回\e后跟文字(0x1b\,从而有效地过滤掉[行之前的行。

但是,顶部的多行= Heading命令可以更直接,更快地表达您的意图。

答案 1 :(得分:0)

这是在@ mklement0的帮助下我最终得到的代码。此Powershell脚本为两个版本的AsciiDoc文件创建了MS Word样式的曲目更改。它创建Diff文件,使用正则表达式将HTML / CSS标签替换ASCII代码,删除Diff标头(谢谢!),使用AsciiDoctor创建HTML文件,然后使用PrinceXML创建输出的PDF文件,我可以发送该文件记录审稿人。

    git diff --color-words file1.adoc file2.adoc > result.adoc;
Get-Content "result.adoc" | % {
$_  -Replace '(=+ ?)([A-Za-z\s]+)(\[m)', '$1$2' `
    -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"

以下是来自维基百科的一些文本的结果屏幕截图:

enter image description here