PowerShell - 查找和修改字符串中的多个文本
Posted
技术标签:
【中文标题】PowerShell - 查找和修改字符串中的多个文本【英文标题】:PowerShell - Finding and modifying multiple text in string 【发布时间】:2020-08-23 10:54:42 【问题描述】:例如,我有以下文本(存储为$test
):
\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cimg src=\"/sites/mysite/SiteCollectionImages/banner.jpg\" alt=\"\" 样式=\“浮动:无;高度:自动;宽度: auto\"/\u003e\n\u003cp\u003e更多的肉,更少的浪费,意味着更多的价值 为您 美元。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e当 在您的食谱中替代鸸鹋肉或计划您的服务 部分,请记住,低脂鸸鹋肉不会像 其他肉类。你得到更多你付出的没有骨头,外部 脂肪,或软骨。鸸鹋肉在货架上非常稳定,尤其是在真空的情况下 包装。正确真空包装的肉类将保持新鲜 冰箱长达 4 周,您的冰箱长达 6-9 个月 冰箱。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cimg src=\"/sites/mysite/SiteCollectionImages/logo.jpg\" alt=\"\" 样式=\“浮动:无;高度:自动;宽度: 自动\"/\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e
我想更新img src=\"
和\"
之间的粗体文本(类似于/sites/newSite/newLibrary/originalFilename.v2.jpg
)
我将如何使用正则表达式在 Powershell 中进行这些替换?
我已经尝试过 $test -replace '(?<=img src=\")(?<imgUrl>\")', ' '
启动,但即使这样也无法替代我。
更新
我能够使用$test -replace '(?<=img src=\\")(.+?)(?=\\")', '$1'
捕获我需要替换的内容(感谢@user1390638)
我想在替换之前对$1
应用一个函数,所以我必须这样做才能使其工作:
[regex]::Replace($test, '(?<=img src=\\")(.+?)(?=\\")', param($match) someFunction($match.Groups[1].Value) )
【问题讨论】:
更新了我的答案,将“争夺”功能应用于比赛。 【参考方案1】:您的正则表达式错误,要匹配您之间的字符串,应使用以下正则表达式。
正则表达式的第一部分 (? 正则表达式的第二部分 .+?得到之间的一切,?表示非贪婪,所以它会在第一场比赛停止 正则表达式的最后一部分 (?=") 表示直到引用为止。(?<=img src=\\").+?(?=")
假设您的文本已分配给 $text 变量。
$text -replace('(?<=img src=\\").+?(?=")',"/sites/newSite/newLibrary/originalFilename.v2.jpg")
要替换多个文本,基本上可以调用两次 -replace 如 $text -replace(...) -replace(...)
【讨论】:
我明白了,但我仍然想捕捉比赛,因此我使用<imgUrl>
,这样我就可以在原版的基础上对替换进行一些修改。我该怎么办?基本上,替换文本将是某个函数的参数,它会给出新的图像 URL……所以我在想像$test -replace [pattern<imgUrl>], someFunction(imgUrl)
这样的东西。这甚至可能吗?
如果你想做的是在输入上调用函数,你可以在调用replace之前将结果赋给一个像$scrambled_url = scramble('$1')
这样的变量,然后在你的replace中使用这个$scrambled_url变量函数-replace('your pattern', $scrambled_url )
如果这是你想做的。
如果你想在匹配的url上调用函数,首先你可以用-match$text -match '(?<=img src=\\").+?(?=")'
得到匹配的url,一旦你调用match,-match操作符会设置一个特殊的变量叫做$matches。您可以从此变量中获取匹配的字符串并调用您的函数 $scrambled_url = someFunction(-matches[0])
。之后,您可以使用此 $scrambled_url 调用替换函数,就像我在上面的评论中一样。【参考方案2】:
正则表达式
(?<=img src=\\\").+?(?=\\)
(?<=img src=\\\") # Finds `img src=\` escaping `\` and `"`
.+? # Everything between the two outer capture groups
(?=\\) # To the next backslash, again escaping the `\`
如果您想先捕获 url 以使用它做其他事情,您可以创建一个新的正则表达式对象来检查您的匹配项。
$obj = # Import your text here how you like
$regex = [regex]::new('(?<=img src=\\\").+?(?=\\)')
$matches = $regex.Matches($obj)
您可以为要更改路径的内容创建新变量,然后使用匹配项替换文本。添加打乱功能。
function Scramble
Param(
[parameter(ValueFromPipeline=$true)][string]$InputObject
)
$split = $InputObject -split "/" | Select-Object -Skip 1
return "/" + (($split | Get-Random -Count $split.Count) -join "/")
foreach ($match in $matches)
$obj.Replace($match.Value, ($match.Value | Scramble)) # .Net Method here to replace the specific string found. No need for another regex.
【讨论】:
以上是关于PowerShell - 查找和修改字符串中的多个文本的主要内容,如果未能解决你的问题,请参考以下文章