Powershell 脚本将 link:lalala.html[lalala] 替换为 xref:lalala.ado



我有一个文件夹,里面装满了.adoc格式的文本文档,里面有一些文本。全文如下:link:lalala.html[lalala]。我想用xref:lalala.adoc[lalala]替换此文本。所以,基本上,只需将link:替换为xref:.html替换为.adoc,其余部分保持不变。 但问题是lalala可以是任何东西 从单词到../topics/halva.html.

我绝对知道我需要使用正则表达式模式,我以前使用过类似的脚本。包装在对象中的替换指令:

Get-ChildItem -Path *.adoc -file -recurse | ForEach-Object {
$lines = Get-Content -Path $PSItem.FullName -Encoding UTF8 -Raw
$patterns = @{
'([.dfn .term])#(.*?)#' = '$1_$2_' ;
}
$option = [System.Text.RegularExpressions.RegexOptions]::Singleline 
foreach($k in $patterns.Keys){
$pat = [regex]::new($k, $option)
$lines = $pat.Replace($lines, $patterns.$k)
}
$lines | Set-Content -Path $PSItem.FullName -Encoding UTF8 -Force
}

看起来我需要一个不同的脚本,因为新任务不能仅添加为另一个对象。我可以使用两个对象分别替换每个部分:将link:替换为xref:,然后将.html替换为.adoc

但这可能会干扰以.html结尾且不以link:开头的其他链接。在文本中,绝对链接通常一开始没有link:。它们总是从 http://或 https://开始。他们仍然可能会也可能不会以.html结束.所以最好的主意是把整个字符串link:lalala.html[lalala]并尝试用xref:lalala.adoc[lalala]替换它。

我需要了解正则表达式和PowerShell的人的帮助,请这将拯救我。

作为一种模式,您可以使用

blink:(.+?).html(?=[[^][]*])
  • blink:比赛link:
  • (.+?)在第 1 组中捕获至少可能的 1+ 个字符
  • .html比赛.html
  • (?=[[^][]*])从右侧的左方括号到右方括号断言

正则表达式演示

在替换使用组 1 中使用$1

xref:$1.adoc

$Strings = @("link:lalala.html[lalala]", "link:../topics/halva.html[../topics/halva.html]")
$Strings -replace "blink:(.+?).html(?=[[^][]*])",'xref:$1.adoc'

输出

xref:lalala.adoc[lalala]
xref:../topics/halva.adoc[../topics/halva.html]

最新更新