#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://",""
, и это решает проблему.