Парсинг файла в Powershell

У меня есть следующий необработанный контент в файле. Я пытаюсь просто распечатать список всех URL-адресов. Я как бы написал сценарий. Получение содержимого (чтение) из файла и использование строки ForEach в строках, но не знаю, как отфильтровать только URL-адрес из содержимого. Есть идеи ?

Line 18942:         "url": "http://harvardpolitics.com/tag/brussels/",
Line 18994:         "url": "http://203.36.101.164/4f64555b4217b47b7c64b3fec19e389b/1502455203/Telstra/Foxtel-Vod/fxmultismvod5256/store2/ON307529/ON307529_hss.ism/QualityLevels(791000)/Fragments(video=9900000000)"
Line 19044:         "url": "https://www.gucci.com/int/en/ca/women/handbags/womens-shoulder-bags-c-women-handbags-shoulder-bags?filter=%3ANewest%3Acolors%3AGold%7Ccb9822",
Line 19096:         "url": "https://bagalio.cz/batohy-10l?cat=3p%3D1urceni%3D2582p%3D1kapsa_ntb_velikost%3D2179p%3D1manufacturer%3D1302p%3D1color%3D84p=1kapsa_ntb_velikost=2192",
Line 19148:         "url": "http://www.csillagjovo.gportal.hu/gindex.php?pg=31670155",
Line 19200:         "url": "http://www.copiersupplystore.com/hp/color-laserjet-4700dn/j7934a-j7934ar",

person user1911509    schedule 11.08.2017    source источник
comment
Откуда берутся номера строк - они в файле или это ваше добавление к нему? Похоже на часть файла JSON. Если это так, используйте ConvertFrom-Json.   -  person TessellatingHeckler    schedule 12.08.2017
comment
Абсолютно верно, это ответ API в виде большого двоичного объекта JSON. Я отфильтровал их в Notepad ++ с URL-адресом, и появился список из примерно 400 URL-адресов. Я пытался их разобрать, ничего не получилось. Я попробую ConvertFrom-Json и посмотрю, работает ли он.   -  person user1911509    schedule 12.08.2017
comment
Invoke-RestMethod будет неявно преобразовывать ответы API из JSON в объекты PowerShell, кстати, вместо Invoke-WebRequest   -  person TessellatingHeckler    schedule 13.08.2017
comment
Invoke-RestMethod сработал, и он действительно пригодился и стал лучшим решением, чем Invoke-WebRequest. Ценю твою помощь.   -  person user1911509    schedule 13.08.2017


Ответы (2)


Одним из способов может быть метод подстроки, другой версией может быть какое-то регулярное выражение.

$Text = Get-Content D:\Test\test.txt
foreach ($Line in $Text) {
    # SubString Version
    $FirstIndex = $Line.IndexOf('http')
    $URLLength = ($Line.LastIndexOf('"') - $FirstIndex)
    $Line.Substring($FirstIndex, $URLLength)

    # Regex Version 
    $Regex = '(http[s]?|[s]?ftp[s]?)(:\/\/)([^\s,]+)'
    ([regex]::Matches($Line,$Regex)).Value.TrimEnd('"')([^\s,]+)')).Value.TrimEnd('"')
}
person Olaf Reitz    schedule 11.08.2017
comment
Я пробовал, но ничего не выводит. Пробовал выводить в файл - он пустой. - person user1911509; 12.08.2017

Попробуйте это, чтобы просто получить URL-адреса:

$content = Get-Content <file-with-output> # or other way of getting the data

$urls = $content | ForEach-Object { ($_ -replace ".+?(?=http.+)","").Trim('",')}

Изменить: добавлены $urls для получения результата.

person KarlGdawg    schedule 11.08.2017
comment
Просто добавьте $_ -replace '^.*(http[^"]+).*$', '$1' как более простой подход к регулярному выражению (без поиска, без обрезки) - person TessellatingHeckler; 12.08.2017
comment
Мое регулярное выражение немного слабое, спасибо, что показали мне лучший способ. - person KarlGdawg; 12.08.2017
comment
Я попробовал регулярное выражение, но оно выводит только один URL-адрес со строкой 19200. Это что-то с данными, скопированными в файл. Как я уже упоминал выше, ответ от API в виде большого двоичного объекта JSON. Я отфильтровал их в Notepad ++ с URL-адресом, и появился список из примерно 400 URL-адресов. Я пытался их разобрать, ничего не получилось. - Я также попробую с «ConvertFrom-Json». - person user1911509; 12.08.2017
comment
Спасибо всем, я использовал Convert-Json, и все работало нормально. Все вышеперечисленные решения хорошо работали для разбора URL-адресов и вывода в файл. Я ценю вашу помощь в решении этого вопроса. - person user1911509; 13.08.2017