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-Content
或 Out-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"
这是使用维基百科中的一些文本的结果截图:
我正在尝试创建一个 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-Content
或 Out-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"
这是使用维基百科中的一些文本的结果截图: