从powershell中的文本文件替换http链接中的内容

时间:2018-03-07 17:02:48

标签: regex powershell

我是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

1 个答案:

答案 0 :(得分:2)

似乎你想要

  • 删除"www."部分
  • $newEnvironment的值附加到任何网址

一种方法是搜索......

的文字
  • 之前是&#34; http://&#34; - (?<=http://)
  • 以&#34; www。&#34;开头 - www\.
  • 包含空格或斜杠以外的字符,如第1组 - ([^/ ]+)
  • 为了安全起见,$ newEnvironment - (?!\.$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中都有意义。