我正在尝试创建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
显示图片是因为文本中未显示二进制代码
以下语句与文本匹配,因此,如果我什么也没有替换,则将'= Heading'行放在页面顶部。
^[^=]*.[+][\n]
但是在Powershell中,它与文本不匹配。
Get-Content "result2.adoc" | % { $_ -Replace '^[^=]*.[+][\n]', '' } | Out-File "result3.adoc";
关于为什么它在Powershell中不起作用的任何想法?
我的总体目标是创建一个包含两个版本的AsciiDoc文件的差异文件,然后将ASCII代码替换为HTML / CSS代码以显示生成的带有绿色/红色轨道变化的AsciiDoc文件。
答案 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-Content
(Out-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"
以下是来自维基百科的一些文本的结果屏幕截图: