PowerShell, как захватить строку текста после определенного шаблона, но без включения самого шаблона в результаты - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь извлечь / перехватить все 7-символьные строки alphanumeri c, которые идут после определенного c образца текста из текстового файла. Я получаю 7-символьные строки, но я также получаю с ними и другие "шаблонные" символы, которые мне не нужны. Я новичок в regex и PowerShell, и я действительно пробовал перед публикацией здесь.

Вот как выглядит текстовый файл:

{"hash":"hvwRn2V","title":"","description":null,"has_sound":false,"width":1920,"height":1080,"size":444751,"ext":".jpg","animated":false,"prefer_video":false,"looping":false,"datetime":"2016-02-08 09:27:18","edited":"0"},{"hash":"GakvoVT","title":"","description":null,"has_sound":false,"width":1920,"height":1080,"size":189987,"ext":".jpg","animated":false,"prefer_video":false,"looping":false,"datetime":"2016-02-08 09:27:14","edited":"0"},{"hash":"bn0lqId","title":"","description":null,"has_sound":false,"width":1920,"height":1080,"size":466105,"ext":".jpg","animated":false,"prefer_video":false,"looping":false,"datetime":"2016-02-08 09:27:11","edited":"0"},

Мне нужно получить все 7-символьные строки, которые попадают между двумя двойными кавычками, но только если они идут после hash":. Пример из текста выше, мне нужно получить hvwRn2V из hash":"hvwRn2V" и так далее.

Я использую этот код PowerShell, и он работает, но он также дает мне текст шаблона hash": в результате, который я не хочу:

$input_path = 'C:\Users\Jack\textfile.txt'
$output_file = 'C:\Users\Jack\output.txt'
$regex = 'hash":"([a-zA-Z_0-9]){7}'
Select-String -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file

То, что я получаю, это :

hash":"hvwRn2V
hash":"GakvoVT
hash":"bn0lqId

Что я делаю не так?

Заранее благодарю за помощь.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вам нужно обернуть 7-символьный шаблон с захватом скобок и записать $_.Groups[1].Value в выходной файл:

$input_path = 'C:\Users\Jack\textfile.txt'
$output_file = 'C:\Users\Jack\output.txt'
$regex = 'hash":"([a-zA-Z0-9_]{7})"'
Select-String -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Groups[1].Value } > $output_file

Примечание. Я также добавил " в конце шаблона, чтобы убедиться, что извлекаемые значения представляют собой ровно 7-символьные строки в двойных кавычках.

0 голосов
/ 20 апреля 2020

Этот текст json. Если вы заключите текст в квадратные скобки [], это будет массив объектов. Распечатайте свойство ha sh в каждом объекте следующим образом:

cat file.json | convertfrom-json | % hash

hvwRn2V
GakvoVT
bn0lqId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...