Как проверить наличие строки в файле с помощью PowerShell? - PullRequest
0 голосов
/ 05 марта 2019

У меня 1-й текстовый файл выглядит так: 12AB34.US.Второй текстовый файл - CD 34 EF.Я хочу найти, что мой 2-й текстовый файл существует или отсутствует в 1-м текстовом файле.

Я пытался вырезать последние 3 символа в первом текстовом файле (.US).Затем я делю на каждые 2 символа (потому что 2-й текстовый файл состоит из 2 символов).Затем я попробовал этот код, и он всегда возвращает «Не найдено».

$String = Get-Content "C:\Users\te2.txt"
$Data = Get-Content "C:\Users\Fixed.txt"
$Split = $Data -split '(..)'

$Cut = $String.Substring(0,6)

$String_Split = $Cut -split '(..)'
$String_Split

$Check= $String_Split | %{$_ -match $Split}
if ($Check-contains $true) {
    Write-Host "0"
} else {
     Write-Host "1"
}

1 Ответ

0 голосов
/ 05 марта 2019

Существует ряд проблем с вашим текущим подходом.

  1. Группы из двух символов не совпадают:
    # strings split into groups of two
    '12'    'AB'    '34'        # first string
    'CD'    ' 3'    '4 '        # second string

Когда вы тестируете несколько строк с помощью -match, вам необходимо

  1. экранировать входную строку, чтобы избежать совпадений с метасимволами (например, .), и
  2. поместите коллекцию слева от оператора, рисунок справа:

$Compare = $FBString_Split | % {$Data_Split -match [regex]::Escape($_)}
if ($Compare -contains $true) {
    Write-Host "Found"
} else {
     Write-Host "Not Found"
}

Для более общего решениячтобы выяснить, является ли любая подстрока из N символов одной строки также подстрокой другой, вы, вероятно, могли бы сделать что-то вроде этого:

$a = '12AB34.US'
$b = 'CD 34 EF'

# we want to test all substrings of length 2
$n = 2

$possibleSubstrings = 0..($n - 1) | ForEach-Object {
    # grab substrings of length $n at every offset from 0 to $n
    $a.Substring($_) -split "($('.'*$n))" | Where-Object Length -eq $n |ForEach-Object {
        # escape the substring for later use with `-match`
        [regex]::Escape($_)
    }
} |Sort-Object -Unique

# We can construct a single regex pattern for all possible substrings:
$pattern = $possibleSubstrings -join '|'

# And finally we test if it matches
if($b -match $pattern){
    Write-Host "Found!"
}
else {
    Write-Host "Not found!"
}

Этот подход даст вам правильныйответ, но это будет очень медленно на больших входах, и в этот момент вы можете захотеть взглянуть на стратегии, не основанные на регулярных выражениях, такие как Boyer-Moore

...