搜索模式并替换powershell

时间:2015-12-09 17:07:57

标签: powershell replace

我正在尝试浏览一个文件并用通用的东西替换任何FQDN机器。这就是我到目前为止所得到的。

get-content $location\$file | ForEach-Object { $_ -replace  ".*domain.com" , 'machine.local' }

输出不是我想要的,我不知道为什么。就像它一起切断了部分文档。 例如,这是我的测试文档

server.domain.com是什么东西server2.domain.com的东西

结果输出是

machine.local的东西 要么 machine.local的东西。

请帮忙,这让我发疯了。

2 个答案:

答案 0 :(得分:0)

问题是你的正则表达式.*是贪婪的,并且会抓住所有字符到行的开头。将你的正则表达式改为:

\w+\.domain.com

这只是抓取domain.com之前的一个词和一段时间。我不确定这将如何与其他数据一起使用,因为您只提供了一个示例。

答案 1 :(得分:0)

我在打字的时候看到你接受了答案,但我会详细介绍一下,所以我还是要添加我的答案。

好的,这是一个RegEx问题。让我们从您的RegEx意味着什么开始。为此我请参考RegEx101.com,这是一个用于测试和排除正则表达式(RegEx)故障的强大站点。当您使用-Replace方法时,它会默认执行RegEx匹配,并且您的RegEx会像这样分解:

.*

RegEx中的点(。)字符将匹配任何字符(新行除外,具体取决于搜索修饰符)。星号导致前一个事物(在这种情况下是匹配任何东西的点)重复该匹配零次或多次。正如它所写的那样,它被称为“贪婪的”'匹配,并且它将尽可能多地匹配,同时将满足RegEx匹配的条款。

domain

这与字域匹配,字面意思,但不区分大小写。

.

有点再次点,并且之后没有*或+,所以它会真正匹配任何一个字符。

com

这匹配单词com,不区分大小写。

所以我们把所有这些放在一起,我们得到:

将所有内容与单词'域'匹配,后跟任何单个字符,后跟单词' com'。

我认为更适合你的是:

(GC $file) -replace 'domain\.com', 'machine.local'

除非你想要替换服务器名称,否则我会使用:

(GC $file) -replace '\S+\.domain\.com', 'machine.local'

这使用与任何非空白字符匹配的\S特殊字符,因此除了空格和制表符之外的任何其他内容。 +表示必须至少有其中一个,但它会尽可能多地匹配。然后我们逃避这段时间,因为正如我上面提到的那样,点是RegEx中的一个特殊字符,它匹配任何东西(包括空格!)。

这实际上与Dave Sexton的答案几乎完全相同,除了我的\w匹配字母,数字和一些(非常有限的)特殊字符时,我的灵活性更强一些。

因此,新匹配的更新后的RegEx101链接:https://regex101.com/r/aA1gI1/2

我希望你现在能够更好地理解你为什么遇到这个问题,而不只是有一个有效的答案,但你不知道为什么。