【发布时间】:2023-03-21 19:36:01
【问题描述】:
在 Powershell 中,如何在文本文件中的每一行中搜索模式数组? Select-string 的模式可以接受一个数组,但如果找到数组中的任何字符串,它就会返回一个真值。如果在行中找到数组中的所有字符串,我需要它返回 true(或实际上是行)。谢谢。
【问题讨论】:
标签: string powershell design-patterns
在 Powershell 中,如何在文本文件中的每一行中搜索模式数组? Select-string 的模式可以接受一个数组,但如果找到数组中的任何字符串,它就会返回一个真值。如果在行中找到数组中的所有字符串,我需要它返回 true(或实际上是行)。谢谢。
【问题讨论】:
标签: string powershell design-patterns
为了匹配一个字符串数组和一个模式数组,我相信你需要这样的东西:
$patterns = @( ... )
Get-Content sample.txt | % {
$count = 0
foreach ($p in $patterns) {
if ($_ -match $p) { $count++ }
}
if ($count -eq $patterns.Length) { $_ }
}
或者像这样:
$patterns = @( ... )
$content = Get-Content sample.txt
foreach ( $line in $content ) {
$count = @($patterns | ? { $line -match $_ }).Length
if ( $count -eq $patterns.Length ) { $line }
}
【讨论】:
想不通
Get-Content file.txt |
Where-Object {$_ -match $ptrn1 -and $_ -match $ptrn2 -and $_ -match $ptrn3}
【讨论】:
另外两种可能性:
$patterns = 'abc','def','ghi'
$lines = 'abcdefghi','abcdefg','abcdefghijkl'
:nextline foreach ($line in $lines)
{foreach ($pattern in $patterns)
{if ($line -notmatch $pattern){continue nextline}
}$line}
abcdefghi
abcdefghijkl
一旦任何模式不匹配,这将放弃对一行的进一步处理。
这一次对整个行集合起作用,而不是做一个 foreach:
$patterns = 'abc','def','ghi'
$lines = 'abcdefghi','abcdefg','abcdefghijkl'
foreach ($pattern in $patterns)
{$lines = $lines -match $pattern}
$lines
abcdefghi
abcdefghijkl
用您的 get-content 替换测试文字以填充 $lines。
【讨论】: