当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用PowerShell Replace来替换文本[示例]

作者:精品下载站 日期:2024-12-14 13:06:50 浏览:15 分类:玩电脑

如何使用PowerShell Replace来替换文本[示例]


与许多其他语言一样,PowerShell 可以处理字符串和文本。这些有用的功能之一是使用 PowerShell 替换文件内的字符、字符串甚至文本。

在本教程中,您将学习如何使用 PowerShell replace() 方法和 PowerShell replace 运算符。本教程将涵盖基础知识,甚至深入研究一些“有趣”的正则表达式!

在你开始之前

您不需要花太多时间就能理解本教程中的所有示例;你只需要 PowerShell。本教程示例将使用 PowerShell v7.0.2,但所有示例都应在 Windows PowerShell 中运行。

使用 PowerShell 替换字符串:基础知识

使用 PowerShell 替换的最简单的情况之一是替换字符串中的字符。让我们从一些例子开始。

假设 PowerShell 中有一个值为 hello, world 的字符串。

$string = 'hello, world'

您希望将该字符串中的字符串 hello 替换为字符串 hi,以使 $string 变量的值为 嗨,世界。为此,PowerShell 首先需要找出“查找”文本的位置。一旦找到,它就会用用户定义的值替换该文本。

使用 Replace() 方法

在 PowerShell 中替换字符串的最简单方法之一是替换命令方法,如下所示。 replace() 方法有两个参数;要查找的字符串以及要替换找到的文本的字符串。

如下所示,PowerShell 正在查找字符串 hello用字符串 hi 替换该字符串。然后该方法返回最终结果,即 hi, world

PS> $string.replace('hello','hi')
hi, world

您可以对任何字符串调用 PowerShell 替换方法,以将任何文字字符串替换为另一个字符串。如果未找到要替换的字符串,则 replace() 方法不会返回任何内容。

您不需要将字符串分配给变量来替换字符串中的文本。相反,您可以直接在字符串上调用 replace() 方法,例如:'hello world'.replace('hello','hi')。为了方便起见,本教程使用了变量。

删除字符

也许您想从另一个字符串中删除一个字符串中的字符,而不是用其他字符串替换它。您也可以通过指定空字符串来做到这一点。

PS> $string.replace('hello','')
, world

替换多个实例

现在您已经有了将一个字符串替换为另一个字符串的代码。替换多个字符串怎么样?没问题。

由于 PowerShell Replace 方法返回一个字符串,要替换另一个实例,您可以在末尾附加另一个 replace() 方法调用。然后,PowerShell 对原始输出调用 replace() 方法。

PS> $string.replace('hello','').replace('world','earth')
, earth

您可以根据需要将任意数量的 replace() 方法调用链接在一起,但如果您有许多字符串需要替换,则应考虑使用 replace 运算符。 >

使用 PowerShell 替换运算符

尽管使用 PowerShell 替换字符串方法是替换文本的最简单方法,但您也可以使用 PowerShell replace 运算符。 replace 运算符与提供要查找和替换的字符串的方法类似。但是,它有一个很大的优点:使用正则表达式 (regex) 查找匹配字符串的能力(稍后详细介绍)。

使用上面的示例,您可以使用 replace 运算符以类似的方式将 hello 替换为 hi,如下所示。 PowerShell 执行相同的步骤。

PS> $string -replace 'hello','hi'
hi, world

删除字符

与 PowerShell 替换方法类似,您也可以使用 replace 运算符从字符串中删除字符。但是,与 replace() 方法不同,您也可以完全排除字符串作为替换参数,您会发现相同的效果。

PS> $string -replace 'hello',''
, world
PS> $string -replace 'hello'
, world

替换多个实例

replace() 方法一样,您也可以将 replace 运算符的用法链接在一起。由于 replace 运算符返回一个字符串,如下所示。您将在下一节中看到,使用正则表达式您的代码将变得更加干净。

PS> $string -replace 'hello','hi' -replace 'world','earth'
hi, earth

使用 PowerShell 正则表达式替换

如上所述,在 PowerShell 替换方法中替换字符串是可行的,但它是有限的。您只能使用文字字符串。您不能使用通配符或正则表达式。如果您要执行任何类型的中级或高级替换,则应使用 replace 运算符。

假设您有一个脚本,其中包含一个使用变量创建的字符串。该字符串应该是 hello, worldhi, world。 也许您作为系统管理员度过了糟糕的一天,并且想要将字符串更改为(无论值如何) 再见,世界

您需要将 hello, worldhi, world 都转换为 goodbye, world。为了实现这一点,您需要使用正则表达式。您可以使用正则表达式匹配文本中的任何特定模式。

在此示例中,您可以使用表达式 hello|hi 来使用正则表达式“or”(|) 字符来匹配两个必需的字符串,如下所示。

PS> 'hello, world' -replace 'hello|hi','goodbye'
goodbye, world
PS> 'hi, world' -replace 'hello|hi','goodbye'   
goodbye, world

一旦您了解了如何使用正则表达式来查找字符串,您就可以使用 PowerShell 来替换与任何模式匹配的通配符字符串。

转义正则表达式字符

在上面的正则表达式示例中,要搜索的字符串不包含任何正则表达式特殊字符。正则表达式语言使用的某些字符不像大多数字母和数字那样按字面解释。

例如,也许您需要替换字符串中的文本。该字符串包含几个正则表达式特殊字符,例如括号和问号。然后,您尝试将字符串 [hello] 替换为 goodbye,如下所示。

PS> '[hello], world' -replace '[hello]','goodbye'
[goodbyegoodbyegoodbyegoodbyegoodbye], wgoodbyergoodbyed

这显然不是你想要的。当您在字符串中使用正则表达式特殊字符来查找 ([hello]) 时,就会发生这种情况。

为了避免这个问题,您有两种选择。您可以通过在每个字符前面添加反斜杠来转义这些特殊字符,也可以使用 Escape() 方法。

下面您可以看到用反斜杠转义每个特殊字符的效果。

PS> '[hello], world' -replace '\[hello\]','goodbye'
goodbye, world

或者,建议您使用正则表达式类型的 Escape() 方法自动删除所有特殊字符。

PS> '[hello], world' -replace ([regex]::Escape('[hello]')),'goodbye'
goodbye, world

您应该尽可能使用 Escape() 方法,因为它会转义所有特殊字符,这样您就不必记住它们。

使用匹配/捕获组

在前面的所有示例中,本教程一直使用文字字符串来替换另一个字符串。您一直在使用higoodbye。但是,如果您想使用 PowerShell 在字符串中找到的一个或多个字符来替换,该怎么办?您需要匹配或捕获组。

正则表达式有一个称为捕获组和反向引用的概念。捕获组允许您捕获字符串,然后在其他地方引用。 PowerShell 通过将匹配组与replace 运算符结合使用来利用此功能。

例如,也许您有一个可能包含几个不同值的字符串。

'hello world, you sexy beast'
'hi world, now go away'
'hello earth, you are lovely today'

您想将字符串的第一部分与第二部分交换,使它们看起来像这样:

'you sexy beast,hello world'
'now go away,hi world'
'you are lovely today,hello earth'

要执行此操作,PowerShell 必须找到逗号右侧和左侧的所有文本。一旦它知道该文本是什么,它就必须将其中一个替换为另一个。为此,您需要反向引用。

反向引用是一个正则表达式变量(不是 PowerShell 变量),表示正则表达式匹配的文本。 PowerShell 中的反向引用用美元符号表示,后跟一个数字,表示它们的匹配顺序。

您可以查看下面的示例。

## This string could also be:
## 'hi, world, now go away'
## 'hello, earth, you are lovely today'
PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(.*), (.*)','$2,$1'
you sexy beast,hello world

在上面的示例中,您可以看到正则表达式捕获组用括号将每个匹配项 (hello world) 和 (you sexy bread) 括起来。然后,对于替换,hello word 首先从左到右匹配,因此它获得 $1 反向引用标签,而 you sexy bread 获得 $2 反向引用标签。

一旦 PowerShell 知道每个匹配的值,您就可以按照您想要的方式在替换文本中使用这些引用。在此示例中,$2,$1 交换了它们的位置。

使用命名匹配组

如果您不想使用 $1$2 等数字占位符来引用匹配值,您也可以使用标签或名称。您不必从左到右计算哪些引用意味着什么,只需使用名称即可。

要使用名称作为引用,您需要首先为匹配字符串中的每个匹配定义标签。为此,您必须定义捕获组,如 (?),其中 label 是名称,<regex>是您正在使用的正则表达式。

定义名称后,您可以使用美元符号并将名称括在大括号中,在替换字符串中引用它们,例如$ {标签}

您可以在下面看到该技术的演示。

PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(?<First_Part>.*), (?<Second_Part>.*)','${Second_Part},${First_Part}'
you sexy beast,hello, world

结论

正如您所了解的,PowerShell 替换运算符允许您以多种不同的方式替换字符、文本和字符串。要执行简单的替换,您可以使用 replace() 方法,但如果您需要匹配和替换更高级的内容,请始终使用 replace 运算符。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯