嘲笑我:
我有一个数据文本文件。我想读它,并且只输出包含在搜索词数组中找到的任何字符串的行。
如果我只想找一根弦,我会这样做:
get-content afile | where { $_.Contains("TextI'mLookingFor") } | out-file FilteredContent.txt
现在,我只需要将“TextI'mLookingFor”作为字符串数组,其中如果$ _包含数组中的任何字符串,则将其传递到管道外的文件。
我将如何做到这一点(顺便说一句,我是ac#程序员黑客攻击这个PowerShell脚本,所以如果有更好的方法来完成我的匹配而不是使用.Contains(),请告诉我!)
答案 0 :(得分:31)
试试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
对于单个模式来说也是一个很棒的cmdlet,它只需要几个字符来编写^^
答案 1 :(得分:2)
任何帮助?
$a_Search = @(
"TextI'mLookingFor",
"OtherTextI'mLookingFor",
"MoreTextI'mLookingFor"
)
[regex] $a_regex = ‘(‘ + (($a_Search |foreach {[regex]::escape($_)}) –join “|”) + ‘)’
(get-content afile) -match $a_regex
答案 2 :(得分:2)
没有正则表达式并且可能有空格:
$array = @("foo", "bar", "hello world")
get-content afile | where { foreach($item in $array) { $_.contains($item) } } > FilteredContent.txt
答案 3 :(得分:1)
$a = @("foo","bar","baz")
findstr ($a -join " ") afile > FilteredContent.txt