在多个文件中查找两个字符串的组合

时间:2015-03-23 22:40:23

标签: regex powershell full-text-search

我想搜索文件夹中的文件并在每个文件中找到以下字符串,我想将其输出到文件中。我想在文件中找到2个字符串的组合,无论它是如何写入文件的。即使在这两个字符串的中间存在回车符,我也能找到这些字符串组合。

这是我到目前为止的代码:

$Path = "C:\Promotion\Scripts"
$txt_string1 = "CREATE"
$txt_string2 = "PROC"
$PathArray = @()
$Results = "C:\Promotion\Errors\Deployment_Errors.txt"

# This code snippet gets all the files in $Path that end in ".sql".
Get-ChildItem $Path -Filter "*.sql" | 
   Where-Object { $_.Attributes -ne "Directory"} | 
   ForEach-Object { 
      If (Get-Content $_.FullName | Select-String -Pattern $txt_string2) {
         $PathArray += $_.FullName
      }
   }

$PathArray | ForEach-Object {$_} | Out-File $Results

2 个答案:

答案 0 :(得分:0)

用于在txt文件中查找多个字符串您应该像这种方法一样使用

   "hello","guy","hello guy" | Select-String -Pattern '(hello.*guy)|(guy.*hello)'

结果:

hello guy

找到想要输出文件的字符串后 那样:

"hello","guy","hello guy" | Select-String -Pattern '(hello.*guy)|(guy.*hello)' | Out-File -FilePath c:\test.txt

现在我们在test.txt中看到

PS C:\> Get-Content test.txt

hello guy

答案 1 :(得分:0)

你可以不用循环来做到这一点。在启用了多行支持的正则表达式中将两个搜索词的组合定义为备选项((?ms))。

$basepath = 'C:\Promotion\Scripts'
$results  = 'C:\Promotion\Errors\Deployment_Errors.txt'

$term1 = 'CREATE'
$term2 = 'PROC'
$pattern = "(?ms)($term1.*$term2|$term2.*$term1)"

Get-ChildItem "$basepath\*.sql" |
  ? { Get-Content $_.FullName -Raw | Select-String -Pattern $pattern } |
  select -Unique -Expand FullName |
  Out-File $results

请注意,这将报告在其中任何位置包含两个术语的任何文件,无论它们之间是否有其他文本。如果您只想查找包含两个术语组合的文件(未分隔(CREATEPROCPROCCREATE)或仅分隔空格,请将模式更改为:

$pattern = "(?ms)($term1\s*$term2|$term2\s*$term1)"

根据您的搜索条件,在构建正则表达式之前撤消它们也是一个好主意,这样您就不会得到不需要的元字符(不太可能有两个字符串文字,但只是为了安全方面):

$term1 = [regex]::Escape('CREATE')
$term2 = [regex]::Escape('PROC')