Regex 使用Powershell正则表达式仅替换多个文件中单词的前8个实例

Regex 使用Powershell正则表达式仅替换多个文件中单词的前8个实例,regex,powershell,replace,Regex,Powershell,Replace,我有一些nfo文件,我想把一个单词的一些实例换成另一个单词。使用下面的我可以这样做,但它改变了这个词的所有实例,当然这不是我所需要的 $Files = Get-ChildItem -Recurse *.nfo foreach ($File in $Files) { (Get-Content $File -encoding utf8) -replace 'TextToChange','ReplacedText' | Out-File -encoding utf8 ($File.fu

我有一些nfo文件,我想把一个单词的一些实例换成另一个单词。使用下面的我可以这样做,但它改变了这个词的所有实例,当然这不是我所需要的

$Files = Get-ChildItem -Recurse *.nfo
foreach ($File in $Files)
    {
    (Get-Content $File -encoding utf8) -replace 'TextToChange','ReplacedText' | Out-File -encoding utf8 ($File.fullname + '_Changed.nfo')
    }
使用下面的代码只替换单词的前8个实例,这正是我想要的,但我正在努力将其与上面的示例合并

$MyFile = get-content -encoding utf8 "C:\Temp\OriginalFile.nfo"
[regex]$pattern = "TextToChange"
$pattern.replace($MyFile, "ReplacedText", 8) | Out-File -encoding utf8 "C:\Temp\OriginalFile_Changed.nfo"
我必须很接近,但我似乎无法将第一个示例中的“-replace'TextToChange','ReplacedText'”部分切换到第二个示例中的regex模式replace parts,这与我发现的任何组合都不起作用

我需要它来运行文件夹中的所有NFO,并且只对每个文件中单词的前8个实例进行更改,NFO的数量会有所不同,每次文件名都会有所不同,所以我不想指定特定的输入文件,也不想一次只指定这些文件

这可能很简单,我错过了一些愚蠢的事情,但是有人能给我指出正确的方向吗?或者理想的情况下,为我把这两者结合起来,这样就行了?最好是以尽可能接近第一个示例布局的方式完成,以便所有内容都易于理解,尤其是我出错的地方,但我很乐意接受任何有效的内容


谢谢

我想这样可能行得通:

[RegEx]$Pattern = "TextToChange"

$Files = Get-ChildItem -Recurse *.nfo
foreach ($File in $Files)
{
    $Content = Get-Content $File -Encoding utf8 -Raw 
    $Content = $Pattern.Replace($Content, "ReplacedText", 8)
    
    $Content | Set-Content -Path ($File.FullName + '_Changed.nfo') -Encoding utf8 
}
我应该指出,您计算文件名的方式可能会产生不良结果,如
FileName.nfo\u Changed.nfo
请参阅双扩展名。您可能希望使用
.BaseName
来构造新名称。比如:

($File.BaseName + '_Changed.nfo')
您可能也可以使用
.Extension
,但鉴于您已经进行了筛选,因此了解扩展可能有些过分

更新:

写这篇文章的另一种略为简短的方式:

[RegEx]$Pattern = "TextToChange"

$Files = Get-ChildItem -Recurse *.nfo
foreach ($File in $Files)
{
    $Content = Get-Content $File -Encoding utf8 -Raw 
    $Pattern.Replace($Content, "ReplacedText", 8) |     
    Set-Content -Path ($File.FullName + '_Changed.nfo') -Encoding utf8 
}

这只是将replace的输出直接传输到
Set Content
。然而,我怀疑这是否是内存有效的。既然您已经阅读了
$Content
,那么
.Replace()
的输出将需要一个单独的块来向管道中提供信息。

我认为类似的方法可能会奏效:

[RegEx]$Pattern = "TextToChange"

$Files = Get-ChildItem -Recurse *.nfo
foreach ($File in $Files)
{
    $Content = Get-Content $File -Encoding utf8 -Raw 
    $Content = $Pattern.Replace($Content, "ReplacedText", 8)
    
    $Content | Set-Content -Path ($File.FullName + '_Changed.nfo') -Encoding utf8 
}
我应该指出,您计算文件名的方式可能会产生不良结果,如
FileName.nfo\u Changed.nfo
请参阅双扩展名。您可能希望使用
.BaseName
来构造新名称。比如:

($File.BaseName + '_Changed.nfo')
您可能也可以使用
.Extension
,但鉴于您已经进行了筛选,因此了解扩展可能有些过分

更新:

写这篇文章的另一种略为简短的方式:

[RegEx]$Pattern = "TextToChange"

$Files = Get-ChildItem -Recurse *.nfo
foreach ($File in $Files)
{
    $Content = Get-Content $File -Encoding utf8 -Raw 
    $Pattern.Replace($Content, "ReplacedText", 8) |     
    Set-Content -Path ($File.FullName + '_Changed.nfo') -Encoding utf8 
}

这只是将replace的输出直接传输到
Set Content
。然而,我怀疑这是否是内存有效的。既然您已经阅读了
$Content
,那么
.Replace()
的输出将需要一个单独的块来向管道输送。

您可以使用
.tosubstring()
方法instead@AbrahamZinala那是什么方法?它不在
[String]
[RegEx]
类型上。。。我想知道更多。@Steven,你好。这是我的一个输入错误,它的
.Substring()
方法用于strings.Understand。但是,为了使用
.SubString()
,他必须知道8次出现的位置索引。这并非不可能,他可以编写一个循环,每次使用
.SubString()
&
.IndexOf()
运行8次。IndexOf()将返回该字符串的下一个位置。但是,这会增加很多复杂性。尽管如果正则表达式变得超复杂,那么长度可能不如可读性重要,这可能取决于受众。请允许我向新来者提供标准建议:如果你有答案,你将通过向未来读者展示解决问题的方法来帮助他们。要接受答案,请单击大标题✓ 答案左侧大数字下方的符号(您将获得2点声誉积分)。如果你至少有15个声望点,你也可以投票给其他有用的答案(也可以选择被接受的答案)。如果您的问题尚未解决,请提供反馈,或者,如果您自己找到了解决方案,您可以使用
.tosubstring()
方法instead@AbrahamZinala那是什么方法?它不在
[String]
[RegEx]
类型上。。。我想知道更多。@Steven,你好。这是我的一个输入错误,它的
.Substring()
方法用于strings.Understand。但是,为了使用
.SubString()
,他必须知道8次出现的位置索引。这并非不可能,他可以编写一个循环,每次使用
.SubString()
&
.IndexOf()
运行8次。IndexOf()将返回该字符串的下一个位置。但是,这会增加很多复杂性。尽管如果正则表达式变得超复杂,那么长度可能不如可读性重要,这可能取决于受众。请允许我向新来者提供标准建议:如果你有答案,你将通过向未来读者展示解决问题的方法来帮助他们。要接受答案,请单击大标题✓ 答案左侧大数字下方的符号(您将获得2点声誉积分)。如果你至少有15个声望点,你也可以投票给其他有用的答案(也可以选择被接受的答案)。如果您的问题尚未解决,请提供反馈,或者,如果您自己找到了解决方案,.Hi,虽然没有成功,但已接近成功。在Powershell ISE中运行,它创建了带有_Changed.nfo的新文件,但文件内容与输入的nfo文件保持不变,它还将所有文本从nfo输出到屏幕,但屏幕上确实显示了更改,只需立即将其输入到_Changed.nfo中。将$content=添加到$Pattern.Replace前面并将全名替换为basename@DougMaurer ,一如既往地谢谢你。我把它当作