Добавьте регулярное выражение к строкам в текстовом файле, если оно еще не присутствует

#regex #powershell #if-statement

#регулярное выражение #powershell #if-оператор

Вопрос:

Я пытаюсь добавить регулярное выражение в начало каждой строки в текстовом файле, если оно еще не присутствует. Входные данные представляют собой список URL-адресов, а регулярное выражение — список протоколов.

Я пробовал разные циклы if / else и командлеты, такие как add-content / set-content, для добавления регулярного выражения, но логика каждый раз отключается. В настоящее время у меня есть:

 $content = Get-Content "C:pathtofiletest.txt"
$pattern = "[regex]::^(http://www.|https://www.|http://|https://|tcp://|ssl://)" 
ForEach-Object { 
    if ($content -match $pattern) 
        {$content}
    else {
        {foreach($_ in $content) {"^(http://www.|https://www.|http://|https://|tcp://|ssl://)"   $_ }}
          }
 } | Out-File "C:pathtofiletest.txt"
  

Я бы хотел, чтобы результат был

 ^(http://www.|https://www.|http://|https://|tcp://|ssl://)netflix.com
^(http://www.|https://www.|http://|https://|tcp://|ssl://)google.com
^(http://www.|https://www.|http://|https://|tcp://|ssl://)yahoo.com
  

но фактический результат

 "^(http://www.|https://www.|http://|https://|tcp://|ssl://)"   $_
  

Комментарии:

1. Вы создали блок скрипта вокруг вашего Foreach внутри вашего else. Удалите { перед и удалите } после Foreach.

2. Без образца вашего ввода трудно определить, что должен делать ваш код. IMO ваш шаблон может быть упрощен до $pattern = [regex]"^(https?://(www.)?|tcp://|ssl://)"

Ответ №1:

Я думаю, что я понял это, но мне пришлось угадать некоторые вещи во входных данных.

Это то, что я использовал для ввода

 google.com
yahoo.com
netflix.com
  

Это модифицированный powershell, который я использовал. Если строка во входных данных не соответствует шаблону в начале строки, она заменит текущую строку заменяющим текстом, включающим шаблон. Затем он ищет индекс исходной строки во входных данных и заменяет его. Наконец, он записывает все это обратно в исходный файл.

 $content = Get-Content "C:pathtofiletest.txt"
$pattern = "^(http://www.|https://www.|http://|https://|tcp://|ssl://)" 

$content | ForEach-Object { 
    if ($_ -notlike $pattern  "*") {
        #Write-Host "^(http://www.|https://www.|http://|https://|tcp://|ssl://)"   $_ 
        $replaceText = $_ -replace "^$_$", "$pattern$_"  
        $content[($content.IndexOf("$($content -like "$_")"))] = $replaceText
    }
}

$content | Set-Content "C:pathtofiletest.txt"
  

Вывод файла обновления:

 ^(http://www.|https://www.|http://|https://|tcp://|ssl://)google.com
^(http://www.|https://www.|http://|https://|tcp://|ssl://)yahoo.com
^(http://www.|https://www.|http://|https://|tcp://|ssl://)netflix.com
  

Комментарии:

1. Забыл упомянуть, что -replace идентификатора $ReplaceText «^$_$», который является регулярным выражением ^ начало строки, $_ из канала и регулярным выражением $ конец строки.

2. Это именно то, что я имел в виду! Большое спасибо! Вы были правы с вводимыми данными, я приношу извинения за то, что не разъяснил это в исходном сообщении. В исходном списке более 12 000 записей, поэтому я пытался упростить его для целей тестирования. Если некоторые записи в списке уже содержат протокол в начале строки (http:// netflix.com ) этот скрипт просто добавит шаблон регулярного выражения в начало этого. Возможно ли заменить этот протокол шаблоном регулярных выражений?

3. Разобрался. Я добавил $content = $content -replace "http://","" , и это решает проблему.