Поиск строк в файле в соответствии с аргументами

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

Например: test.txt

apple
car
computer
tree

./select.ps1 test.txt или

Результат должен быть таким:

computer

Я написал это:

foreach ( $line in $args[0] ) {
        Get-Content $line | Select-String -Pattern $args[1] | Select-String -Pattern $args[2] | Select-String $args[3]
}

Но что, если я хочу использовать, например, 10 параметров и не хочу постоянно менять свой код? Как бы я справился с этим?

3 ответа

Решение

Вам нужно два цикла: один для обработки каждой строки входного файла, а другой для сопоставления текущей строки с каждым символом фильтра.

$file = 'C:\path\to\your.txt'

foreach ($line in (Get-Content $file)) {
  foreach ($char in $args) {
    $line = $line | ? { $_ -like "*$char*" }
  }
  $line
}

Обратите внимание, что это потребует дополнительной работы, если вы хотите сопоставить выражения более сложные, чем один символ за раз.

Предлагая что-то другое, просто для удовольствия:

$Items = "apple", "car", "computer", "tree"

Function Find-ItemsWithChar ($Items, $Char) {
    ForEach ($Item in $Items) {
        $Char[-1..-10] | % { If ($Item -notmatch $_) { Continue } }
        $Item
    }
} #End Function Find-ItemsWithChar

Find-ItemsWithChar $Items "oer"

Вы хотели бы загрузить переменную $Items вместе с вашим файлом:

$Items = Get-Content $file

Я бы посмотрел на это и это.

Я также хотел бы отметить:

Select-String способен искать более одного элемента с несколькими шаблонами одновременно. Вы можете использовать это в своих интересах, сохранив буквы, которые вы хотите сопоставить, в переменную и проверив их все одной строкой.

$match = 'a','b','c','d','e','f'
Select-String -path test.txt -Pattern $match -SimpleMatch

Это вернет вывод как:

test.txt:1:apple
test.txt:2:car
test.txt:3:computer
test.txt:4:tree

Чтобы получить только слова, которые соответствуют:

Select-String -Path test.txt -Pattern $match -SimpleMatch | Select -ExpandProperty Line

или же

(Select-String -Path test.txt -Pattern $match -SimpleMatch).Line
Другие вопросы по тегам