在powershell中,我需要遍历并返回以user1
开头的所有唯一的第一个元素的列表(在第一个::
之前)。 puppet_
和puppet_customer
。如果可能,请从puppet_列表中排除某些内容,例如puppet_edcs
和puppet_enterprise
和puppet_metrics_collector
puppet_agent
这是我希望它返回的列表
chocolatey
pe_install::install
pe_postgresql::lib::devel
profile::agent_config
puppet_agent::install::remove_packages
puppet_customer::customer_shared::alerts
puppet_customer::email_shared::email
puppet_edcs::claims::grt_api
puppet_enterprise::certs::puppetdb_whitelist
puppet_ets::windows::defaults::audit_policy
puppet_metrics_collector
puppet_policyservicing::owbinet::file_cluster
puppet_printserver::print
puppet_product::avrt::avrt
puppet_quoting::aqw_dca::aqw
puppet_testing::ourtestfile
puppet_webpresence::lifelanes_webapp
role::customer::customer_shared
puppet_customer
puppet_edcs
puppet_ets
puppet_policyservicing
puppet_printserver
puppet_product
puppet_quoting
puppet_webpresence
答案 0 :(得分:2)
您可以使用
'^puppet_(?!enterprise|metrics_collector|agent|testing)\w+'
请参见regex demo。它会在行的开头与puppet_
匹配,但不会立即跟在enterprise
,metrics_collector
,agent
,testing
之后,然后是1个或多个单词字符将被消耗:
请注意,您需要访问完全匹配值,而不是捕获组值,在这种情况下,即访问$_.Matches.Value
。
如果您只想避免匹配,请在{stop}后面加上::
来调整模式,例如
^puppet_(?!(?:enterprise|metrics_collector|agent|testing)::)\w+
^^^ ^^^
请参阅此regex demo。
答案 1 :(得分:1)
Wiktor Stribiżew's helpful answer通过提供必需的正则表达式解决了您的问题,该正则表达式涉及否定超前断言((?!...)
)。
此答案为您显示了避免所需正则表达式复杂的替代方法。
PowerShell具有许多灵活的cmdlet和字符串运算符,虽然通过管道链接它们可能不是最快的选择,但它允许使用概念上简单的解决方案:
$invoke.name -split '::' -like 'puppet_*' |
Sort-Object -Unique |
Where { $_ -notin 'puppet_enterprise', 'puppet_metrics_collector', 'puppet_agent'}
注意:以上假设在任何给定行中,以::
开头的puppet_
分隔的令牌仅以该行的 first 令牌出现,如果有的话;如果该假设不成立,则需要做更多的工作。
答案 2 :(得分:0)
尝试一下:
$yourlist | where {$_ -like "puppet_*" -and $_ -notlike '*puppet_enterprise*' -and $_ -notlike '*puppet_metrics_collector*' -and $_ -notlike '*puppet_agent*' } |
%{($_ -split "::")[0]} | sort -Unique
答案 3 :(得分:-1)