Powershell: фильтровать содержимое файла массивом строк

Загади меня это:

У меня есть текстовый файл данных. Я хочу прочитать его и только выходные строки, содержащие любую строку, найденную в массиве поисковых терминов.

Если бы я искал только одну строку, я бы сделал что-то вроде этого:

get-content afile | where { $_.Contains("TextI'mLookingFor") } | out-file FilteredContent.txt

Теперь мне просто нужно, чтобы "TextI'mLookingFor" был массивом строк, где, если $_ содержит любую строку в массиве, он передается по каналу в файл.

Как бы я это сделал (и BTW, я программист aС#, взломавший эту powershell script, поэтому, если есть лучший способ сделать мой матч выше, чем использовать .Contains(), подскажите мне!)

Ответ 1

Попробуйте Select-String. Он позволяет создавать массивы шаблонов. Пример:

$p = @("this","is","a test")
Get-Content '.\New Text Document.txt' | Select-String -Pattern $p -SimpleMatch | Set-Content FilteredContent.txt

Обратите внимание, что я использую -SimpleMatch, чтобы Select-String игнорировал специальные регулярные выражения. Если вы хотите регулярное выражение в ваших шаблонах, просто удалите это.

Для одного шаблона я, вероятно, использовал бы это, но вам придется избегать символов регулярных выражений в шаблоне:

Get-Content '.\New Text Document.txt' | ? { $_ -match "a test" }

Select-String - отличный командлет для одиночных шаблонов, ему всего несколько символов дольше, чтобы писать ^^

Ответ 2

Любая помощь?

$a_Search = @(
    "TextI'mLookingFor",
    "OtherTextI'mLookingFor",
    "MoreTextI'mLookingFor"
    )


[regex] $a_regex = ‘(‘ + (($a_Search |foreach {[regex]::escape($_)}) –join "|") + ‘)’

(get-content afile) -match $a_regex 

Ответ 3

без регулярного выражения и с возможными пробелами:

$array = @("foo", "bar", "hello world")
get-content afile | where { foreach($item in $array) { $_.contains($item) } } > FilteredContent.txt

Ответ 4

$a = @("foo","bar","baz")
findstr ($a -join " ") afile > FilteredContent.txt