3

我正在尝试查看文件中是否存在某些输入的条目,因此我使用正则表达式来查询每一行:

cat $file | where {$_ -match "^script\$fileName -*"}

其中 $fileName 是在别处定义的一些输入。

如何更改正则表达式以插入变量而不是匹配 '$fileName' ?

4

3 回答 3

9

除了给出的答案,因为 $fileName 可能包含诸如“。”之类的字符。或 '\' 您应该按如下方式对其进行转义:

cat $file | where {$_ -match "^script\\$([regex]::Escape($fileName)) -*"}

Escape 方法将转义像 '.' 这样的位。以及对于你。

例如

[regex]::Escape(".\bar.txt")

\.\\bar\.txt
于 2012-11-08T10:02:47.143 回答
3

$fileName被插值,所以你最终得到一个传递给正则表达式的字符串,如下所示:

cat $file | where {$_ -match "^script\foo.txt -*"}

当实际上我们想要一个 liternal来匹配\时,它充当了下一个字符的转义字符。\在这种情况下,您需要转义转义字符,例如:

cat $file | where {$_ -match "^script\\$fileName -*"}
于 2012-11-08T00:33:08.767 回答
0

也可以在 powershell 内部分解 RegEx。

$fileName = 'test'
'^script\test-*' -match ('\^script\\' + $fileName + '-*')

更具可读性,并且可以与变量有括号的多维数组一起使用[]

$fileName = New-Object object[][] 1
$fileName[0] = @('test')
'^script\test-*' -match ('\^script\\' + $fileName[0][0] + '-*')
于 2019-09-17T15:55:08.137 回答