gpt4 book ai didi

string - 尝试替换文件中的字符串,但替换太多

转载 作者:行者123 更新时间:2023-12-03 00:48:22 28 4
gpt4 key购买 nike

我正在尝试将PowerShell脚本放在一起以通过txt日志文件运行并删除域名/ URL。

到目前为止,我只是在文件上进行查找替换,但是当我尝试这样做时,它无法按我期望的方式工作,例如

如果我有一个包含以下内容的文本文件:

intranet.contoso.com and some text



运行我的脚本以用DOMAIN1替换intranet.contoso.com之后,我得到的输出是

DOMAIN1 DOMAIN1aDOMAIN1nDOMAIN1dDOMAIN1 DOMAIN1sDOMAIN1oDOMAIN1mDOMAIN1eDOMAIN1 DOMAIN1tDOMAIN1eDOMAIN1xDOMAIN1tDOMAIN1



所以我不确定我要去哪里。到目前为止,我的代码是
$domains = ,("mydomain.net","mydomain"),("yourdomain.net","yourdomain"),("mydomain2.net","mydomain2")
$path = Read-Host "Please enter the full path to the directory containing the files to be sanatized"

$files = Get-ChildItem –Path $path *.txt
foreach ($file in $files)
{
for($x=0; $x -lt $domains.Count; $x++)
{
(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace $domains[$x][0], "DOMAIN$($x+1)" } |
Set-Content $file.PSPath

(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace $domains[$x][1], "DOMAIN$($x+1)" } |
Set-Content $file.PSPath

}
}

最佳答案

我确定您的主要问题是在定义$domains时使用unary operator。如果您看您的第一个元素。

PS D:\temp> $domains[0]
mydomain.net
mydomain

您原本希望的,但是下一步将发生问题。让我们尝试获取“mydomain”字符串
PS D:\temp> $domains[0][1]

没有?真奇怪如果您知道发生了什么,那不是真的。让我们看一下这个锯齿状数组的另一个元素。
PS D:\temp> $domains[0][0]
mydomain.net
mydomain

这是什么废话?数组的第一个元素的第一个元素是另一个数组。现在看这个:
PS D:\temp> $domains[0][0][1]
mydomain

我们曾尝试过一些步骤来实现这一要素。您创建了一个数组,其中第一个元素是包含两个元素的数组的数组。

测试文件看起来像这样做的原因是,第一个示例将尝试使用 $domains[0][1],该字符串将为null并匹配字符之间的每个空格,从而输出。

简单删除一元运算符。
$domains = ("mydomain.net","mydomain"),("yourdomain.net","yourdomain"),("mydomain2.net","mydomain2")

同样值得注意的是, -replace是一个正则表达式运算符,因此您需要小心在匹配的字符串中使用元字符。例如时期。静态正则表达式方法转义可以为您解决此问题,以确保您的字符串在字面上匹配。
$_ -replace [regex]::Escape($domains[$x][1]), "DOMAIN$($x+1)"

您还可以知道 -replace也是一个数组运算符,从而改善替换逻辑。因此,在您的循环中,您可以替换此
(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace $domains[$x][0], "DOMAIN$($x+1)" } |
Set-Content $file.PSPath

(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace $domains[$x][1], "DOMAIN$($x+1)" } |
Set-Content $file.PSPath

有了这个。
(Get-Content $file) -replace $domains[$x][0], "DOMAIN$($x+1)"  -replace $domains[$x][1], "DOMAIN$($x+1)" |
Set-Content $file

不需要有效的 .pspath。 cmdlet Get/Set-Content将通过 $file对象中的参数名称与路径匹配。我不能提供更多帮助。这是未经测试的,因为我没有好用的示例文本文件。测试并测试更多内容以确保。

关于string - 尝试替换文件中的字符串,但替换太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36488243/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com