Поиск строк в файле в соответствии с аргументами
У меня есть файл с несколькими словами. Я хотел бы получить только те слова, которые содержат буквы, которые я передал в качестве аргументов в программу.
Например: 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