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(...)

【讨论】:

我明白了,但我仍然想捕捉比赛,因此我使用&lt;imgUrl&gt;,这样我就可以在原版的基础上对替换进行一些修改。我该怎么办?基本上,替换文本将是某个函数的参数,它会给出新的图像 URL……所以我在想像$test -replace [pattern&lt;imgUrl&gt;], someFunction(imgUrl) 这样的东西。这甚至可能吗? 如果你想做的是在输入上调用函数,你可以在调用replace之前将结果赋给一个像$scrambled_url = scramble('$1')这样的变量,然后在你的replace中使用这个$scrambled_url变量函数-replace('your pattern', $scrambled_url ) 如果这是你想做的。 如果你想在匹配的url上调用函数,首先你可以用-match$text -match '(?&lt;=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 - 查找和修改字符串中的多个文本的主要内容,如果未能解决你的问题,请参考以下文章

递归查找文件中的文本 (PowerShell)

PowerShell 在不同目录中查找和替换

在 PowerShell 中查找最新修改的文​​件信息

如何更改多个 .txt 文件中的字符并保存/覆盖 Powershell 中的现有文件

如何使用 PowerShell 处理数组以查找特定字符串?

如何使用PowerShell替换文件中的多个字符串