您的位置:首页 > 运维架构 > Shell

如何在PowerShell中用replace巧妙地替换字符串

2015-06-14 23:30 513 查看
我相信几乎所有人都会使用replace方法去替换一个字符串值,所以这里的文章标题我特地写了“巧妙地”,为什么说是巧妙地呢,因为replace方法所具备的替换能力绝对不是简单的添加一个原始值和替换值那么简单,一起跟着我这篇文章来看一下它还有哪些玩法吧:

我有一个字符串"Hello Anders",我想将这个字符串的Hello替换为Hi,所以结果为"Hi Anders",我们所有人肯定都会像下面这样做,一点都没错:

PS C:\Users\Administrator> "Hello Anders".Replace("Hello","Hi")
Hi Anders
如果我们想要把这两个单词颠倒一下前后顺序应该怎么办呢?可以这样:

PS C:\Users\Administrator> "Hello Anders" -Replace '(.*) (.*)','$2 $1'
Anders Hello
在这里,细心的朋友可能发现了我们用了-replace而不是replace(),它们的作用其实是一样的,但是又有点不一样,因为-replace比replace()更加的具备灵活性,-replace可以做一个正则表达式的替换匹配。这也就是为什么如上例子中,我们用了正则表达式,来替换两个单词的顺序,为了不让PowerShell做$2,$1的直接解析,这里我们用单引号将它们放在一起。

让我们一起再看一个例子,如下例子很明显我是想把[Hello]替换为Hi,可是却得到了出乎意料的结果:

PS C:\Users\Administrator> "[Hello] Anders" -Replace '[Hello]','Hi'
[HiHiHiHiHi] AndHirs
正如我们之前提到的,-replace是一个正则表达式的匹配参数,所以在这里"[","]"方括号被以正则表达式的方法解析替换了Hi,输出了非我们想要的结果。所以我们要稍加做些修改才行,像这样:

PS C:\Users\Administrator> "[Hello] Anders" -Replace '\[Hello\]','Hi'
Hi Anders
这样就告诉了PowerShell,不要去以正则表达式解析,我们加上了"\"去说明,最后我们得到了正确的结果。

当然,很多时候我们未必能清楚的知道每个正则表达式符号,所以你根本不可能像上面这样子手动的去告诉PowerShell哪些是正则表达式符号,然后不要去做解析。所以你可以更直接的使用下面的方法,直接不规避正则表达式解析而去做一个替换:

PS C:\Users\Administrator> "[Hello] Anders" -Replace ([Regex]::Escape("[Hello]")),"Hi"
Hi Anders
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: