我试图找到一个powershell命令来搜索目录中的所有文件,并仅在相对链接中将所有下划线替换为连字符(链接不能以http开头)。
这里是一个例子:
<a href="/always_sunny/is_the_best/">
应该成为
<a href="/always-sunny/is-the-best/">
但是,我希望正则表达式忽略以http开头的href值。因此,应忽略此类链接。
<a href="http://thundergunexpress/always_sunny/"
以下是我正在使用的当前Powershell命令和正则表达式。此正则表达式似乎可以在Notepad ++中部分起作用,以查找和替换下划线,但不排除绝对链接。但是,正则表达式在powershell中根本无法运行,但是我不确定这是由于正则表达式还是我对Powershell的了解有限。非常感谢Powershell命令和正则表达式的帮助。
Get-ChildItem -Path k:\toolbox\powershell\ -recurse | ForEach {If (Get-Content $_.FullName | Select-String -Pattern '(\bhref="|(?!^)\G)[^"<_]*\K_'){(Get-Content $_ | ForEach {$_ -replace '(\bhref="|(?!^)\G)[^"<_]*\K_', '-'}) | Set-Content $_}}
答案 0 :(得分:2)
注意,在匹配两个分隔符之间多次出现的模式时,PCRE与.NET regex不太相似。
.NET正则表达式中的“惯用”方法是使用非固定宽度的后向模式。在这里,您可以使用
(?<=\bhref="(?!http)[^"]*?)_(?=[^"]*")
请参见regex demo。详细信息:
(?<=\bhref="(?!http)[^"]*?)
-向后正向匹配,该位置与紧跟在href="
之后,而不是http
之后,然后是{{1}以外的零个或多个字符的位置},尽可能少"
-一个_
字符_
-紧跟着除(?=[^"]*")
之外的零个或多个字符,然后是"
个字符。