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