我是PowerShell的新手,我创建了以下脚本,它提取了http://和下一个/之间的内容,转换它然后替换初始匹配:
$fileName = "myfile"
$newEnvironment = "NewEnvironment"
$config = Get-Content $fileName
$newConfig = $config | % { $_ -replace "http://www.site.de", "http://site.de.$newEnvironment" }
$newConfig = $newConfig | % { $_ -replace "http://www.site.com.tr", "http://site.com.tr.$newEnvironment" }
$newConfig = $newConfig | % { $_ -replace "http://www.site.fr", "http://site.fr.$newEnvironment" }
$newConfig = $newConfig | % { $_ -replace "http://www.site.pl", "http://site.pl.$newEnvironment" }
$newConfig = $newConfig | % { $_ -replace "http://www.site-1.be", "http://site-1.be.$newEnvironment" }
$newConfig = $newConfig | % { $_ -replace "http://www.site-1.nl", "http://site-1.nl.$newEnvironment" }
$newConfig = $newConfig | % { $_ -replace "http://www.site.it", "http://site.it.$newEnvironment" }
$newConfig | Set-Content $fileName
我试图让它变得更好,可能使用正则表达式或其他东西,但不使用硬编码文本。 有人可以帮帮我吗?
我在想这样的事情:
$path = "myFile";
Get-Content $path | Foreach {$_ -replace "(?<=http://).+?(?=/.*)",".+?(?=/.*).newEnvironment"};
Set-Content $path;
但它没有用,即使它是以这种方式设置链接:
http://.+?(?=/.*).newEnvironment/asd/test.aspx
答案 0 :(得分:2)
似乎你想要
"www."
部分$newEnvironment
的值附加到任何网址一种方法是搜索......
的文字(?<=http://)
www\.
([^/ ]+)
(?!\.$newEnvironment)
并将其替换为&#34; regex group 1&#34; +&#34;。&#34; + $ newEnvironment:
$fileName = "myfile"
$newEnvironment = "NewEnvironment"
$pattern = "(?<=http://)www\.([^/ ]+)(?!\.$newEnvironment)"
$replacement = "`$1.$newEnvironment"
(Get-Content $path) -replace $pattern,$replacement | Set-Content $path
Powershell运营商通常对数组感到满意。 Get-Content
将为您提供一系列行,-replace
将对所有行进行处理。 (-replace
的另一个实际属性是你可以链接它:"abc" -replace "a","A" -replace "b","B"
将起作用。)
这意味着无需编写手动foreach循环。唯一需要的是一对括号,因此Get-Content
不会将-replace
误认为参数。
$1
是对组1的反向引用,反引号是PowerShell的转义字符,因为$
本身在Powershell和regex中都有意义。