String 使用while循环替换Powershell多字符串
我试图解决一个有点奇怪的问题:我需要将原始内容中的字符串替换为来自满足特定匹配条件的相同内容的字符串。输入数据如下所示:String 使用while循环替换Powershell多字符串,string,powershell,replace,while-loop,String,Powershell,Replace,While Loop,我试图解决一个有点奇怪的问题:我需要将原始内容中的字符串替换为来自满足特定匹配条件的相同内容的字符串。输入数据如下所示: apple-beta apple-alpha_orange-beta apple-alpha_orange-alpha_cherry-beta apple-alpha_orange-alpha_kiwi-beta apple-alpha_orange-alpha_mango-beta abcd-alpha_efgh-beta abcd-alpha_efgh-alpha_ijk
apple-beta
apple-alpha_orange-beta
apple-alpha_orange-alpha_cherry-beta
apple-alpha_orange-alpha_kiwi-beta
apple-alpha_orange-alpha_mango-beta
abcd-alpha_efgh-beta
abcd-alpha_efgh-alpha_ijkl-beta
abcd-alpha_efgh-alpha_mnop-beta
apple-beta
_orange-beta
__cherry-beta
__kiwi-beta
__mango-beta
abcd-alpha_efgh-beta
abcd-alpha__ijkl-beta
abcd-alpha__mnop-beta
重播应按如下方式进行:查找内容中的所有“-beta”字符串,并根据“-alpha”字符串删除所有字符串(例如,因为已经存在“orange beta”=>应该删除所有“orange alpha”,因为已经存在“apple beta”=>应该删除所有“apple alpha”等)。结果如下所示:
apple-beta
apple-alpha_orange-beta
apple-alpha_orange-alpha_cherry-beta
apple-alpha_orange-alpha_kiwi-beta
apple-alpha_orange-alpha_mango-beta
abcd-alpha_efgh-beta
abcd-alpha_efgh-alpha_ijkl-beta
abcd-alpha_efgh-alpha_mnop-beta
apple-beta
_orange-beta
__cherry-beta
__kiwi-beta
__mango-beta
abcd-alpha_efgh-beta
abcd-alpha__ijkl-beta
abcd-alpha__mnop-beta
我曾尝试通过大量笨拙的单次替换和临时文件存储,以及一段时间根本不起作用的构建来实现这一点:
$whileinput = get-content -raw C:\content-input.txt
while ($whileinput -match "\w+-beta") {
$fullval = $whileinput -match "\w+-beta" -replace "-beta","-alpha"
$whileinput = $whileinput -replace '$fullval',''
}
非常感谢您的帮助!
丹尼尔我会找到你所有的测试项目。然后替换相应的alpha项
$data = Get-Content C:\content-input.txt
$betas = ([regex]::Matches($data,'[^_]*?(?=-beta)').Value -ne '' | Foreach-Object {
[regex]::Escape($_)} ) -join '|'
$data -replace "($betas)-alpha"
说明:
[regex]::Matches()。Value
仅返回匹配的文本
[^\uU]*?
惰性地匹配不是\uU
的连续字符(?=-beta)
是文本-beta
的正向前瞻,但不包括匹配中的文本
-ne'
用于过滤掉空白输出
[regex]::Escape()
在这种情况下不一定需要。但是,当您的文本可能有您想要逐字匹配的特殊正则表达式字符时,这是一种很好的做法
$betas
包含
分隔项,因为
是regex或
。使用()
包围$betas
字符串可以在替换中匹配-alpha
之前完全匹配其中一个单词。获取内容
将文件的全部内容获取到一个变量中,因此如果文件中的任何内容与该模式匹配,它将无限循环(因为文件的内容始终与您的模式匹配)
PowerShell主要基于“管道”的概念,您可以将其与Foreach对象
cmdlet结合使用,以迭代文件中的每一行
我不太清楚你想要正则表达式做什么,但我不认为你拥有的正则表达式会做你想要的。试试这个
Get-Content -raw C:\content-input.txt | Foreach-Object {
if($_ -match 'beta$') {
$out+=$_ -replace '\w+-alpha',''
}
}
$out | Out-File .\path-to-output.txt
$\uucode>是默认的“管道变量”,即迭代中的当前项-在本例中是当前行。现在至少您的循环正在工作!Hi@flashbang,此解决方案确实修复了循环,但它也删除了值“abcd alpha”。但这有助于我更好地理解循环主题。谢谢!很高兴能提供帮助。我没有花太多时间来处理正则表达式,因为在你的帖子中,这似乎不是你主要关心的问题。祝你好运!