我有一个文件夹,里面装满了.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]