Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Select-String. Парсинг нескольких значений между наборами символов.

Ответить
Настройки темы
PowerShell - Select-String. Парсинг нескольких значений между наборами символов.

Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: rango13
Дата: 17-07-2020
Всем привет!
Уже второй день бьюсь с задачей: есть текстовый файл, из которого необходимо вывести на экран несколько слов/цифр, находящихся между определённым текстом.

Кусок файла, пример

...
!--PREVINFO_START-->Autodesk AutoCAD Electrical 2015<!--PREVINFO_END--></dfsdferwer
'word-break:break-all'>УH5S SV65 V9У1 WDL3 </td></tr>erwedfsdf
td align=left id=2>21T81</td><td align=leftwerewrwer
...
!--PREVINFO_START-->Autodesk AutoCAD 2018<!--PREVINFO_END--></dfsdferwer
'word-break:break-all'>YWP8 10NT JHGJ NJJZ </td></tr>erwedfsdf
td align=left id=2>T2281</td><td align=leftwerewrwer

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


После работы скрипта результат должен быть таким

Autodesk AutoCAD Electrical 2015
УH5S SV65 V9У1 WDL3
21T81

Autodesk AutoCAD 2018
YWP8 10NT JHGJ NJJZ
T2281


Первую строку достаю командой:
Код: Выделить весь код
(Select-String "(?<=!--PREVINFO_START--&gt;)(.*?)(?=]&lt;!--PREVINFO_END--&gt;&lt;/)" -InputObject $content -AllMatches | foreach {$_.matches}).value
Но при этом парсится сразу две первые строчки названий программы. Но не могу понять, как задать сразу несколько условий в запросе выше, чтобы парсилось и название, и серийник, и код продукта. Можете подтолкнуть в правильном направлении?

Отправлено: 18:44, 17-07-2020

 

Аватара для Fors1k

Старожил


Сообщения: 193
Благодарности: 112

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
param(
    $path = "C:\files\qwe.txt"
)cls

(gc $path|sls '(?<=&gt;).+?(?=&lt)' -all).Matches.Value
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:10, 17-07-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Fors1k:
param(
Код: Выделить весь код
 $path = "C:\files\qwe.txt"
)cls
(gc $path|sls '(?<=&gt;).+?(?=&lt)' -all).Matches.Value »
Извините, я привёл только кусок текста. В полном варианте много где встречается набор символов, начинающихся с "&gt;" и заканчивающихся на "&lt". В итоге в выводе получается много лишней информации.

Пример

&lt;!--PREVINFO_START--&gt;Autodesk AutoCAD Electrical 2015
&lt;/td&gt;
&lt;td align=left id=1&gt;&amp;nbsp;
&lt;td align=left id=2&gt;&amp;nbsp;
&lt;td align=left id=1 width=15%&gt;Серийный номер:
&lt;td align=left id=2&gt;
&lt;!--PREVINFO_START--&gt;421-64324142
&lt;/td&gt;
&lt;td align=left id=1 width=15%&gt;Ключ продукта:
&lt;td align=left id=2&gt;21T81
&lt;td align=left id=1&gt;&amp;nbsp;
&lt;td align=left id=2&gt;&amp;nbsp;
&lt;td align=left id=1 width=15%&gt;Код запроса:


Скажите, можно ли в той конструкции, которую вы написали, использовать несколько условий, т.е. обычными словами:

Найти все вхождения в файле, располагающиеся между набором символов ("!--PREVINFO_START--&gt;" и "]&lt;!--PREVINFO_END--&gt;&lt;/") ИЛИ ("'word-break:break-all'&gt;" и "&lt;/td&gt;&lt;/tr&gt;erwedfsdf") ИЛИ ("td align=left id=2&gt;" и "&lt;/td&gt;&lt;td align=leftwerewrwer") ?

Отправлено: 02:05, 18-07-2020 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
(gc C:\temp\test\text.txt) -replace "^.*?gt;" -replace "&lt;.*?$"

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:43, 18-07-2020 | #4


Deadooshka


Сообщения: 2482
Благодарности: 671

Профиль | Отправить PM | Цитировать


Регулярное выражение на всю группу строк с подмасками. Выводим подмаски.
Код: Выделить весь код
$regexp = "!--PREVINFO_START--&gt;(.*?)&lt;!--PREVINFO_END--&gt;&lt;/dfsdferwer
'word-break:break-all'&gt;(.*?)&lt;/td&gt;&lt;/tr&gt;erwedfsdf
td align=left id=2&gt;(.*?)&lt;/td&gt;"

Select-String $regexp -InputObject $content -AllMatches | 
	% {$_.Matches | % {$_.Groups[1..3].Captures.Value; "`n"}}
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:26, 18-07-2020 | #5


Аватара для Fors1k

Старожил


Сообщения: 193
Благодарности: 112

Профиль | Отправить PM | Цитировать


Цитата rango13:
Скажите, можно ли в той конструкции, которую вы написали, использовать несколько условий »
Код: Выделить весь код
param(
    $path = "C:\files\qwe.txt"
)cls

$name   = "(?<=PREVINFO_START--&gt;).*(?=&lt;!--PREVINFO_END)"
$serial = "(?<=word-break:break-all'&gt;).*(?=&lt;/td&gt)"
$code   = "(?<=align\=left id\=2&gt;).*(?=&lt;/td)"

(gc $path|sls "$name|$serial|$code" -all).Matches.Value
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:54, 18-07-2020 | #6


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата rango13:
Уже второй день бьюсь с задачей »
Задача разовая или периодическая, которая требует автоматизации? Лучше от этого отталкиваться...
Цитата rango13:
Можете подтолкнуть в правильном направлении? »
Если говорить о правильном направлении, то лучше декодировать текст, чтобы получить валидный html текст и его уже парсить на предмет необходимых тегов таблицы.
Код: Выделить весь код
gc test.txt -enc utf8|%{[net.webutility]::htmldecode($_)}
и далее, либо воспользоваться встроенным парсером html, либо (что лучше и будет работать, в том числе и в версиях powershell core) воспользоваться внешним модулем PowerHTML
Код: Выделить весь код
#---Эту секцию можно удалить после однократного запуска скрипта от имени админа ------------------
# Установка дополнительного модуля PowerHTML, для независимого парсинга HTML
# Может потребоваться ручное подтверждение установки. 
if (!(get-module -list powerhtml)) {
	write-verbose "Installing PowerHTML module for the current user..."
	install-module powerhtml #-scope currentuser
}
#-----------------------------------------------------------------------------------------

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:32, 18-07-2020 | #7


Аватара для ivan.vas

Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Fors1k:
(gc $path|sls "$name|$serial|$code" -all).Matches.Value »
Подскажите, при такой конструкции получается вывод следующий будет?
Код: Выделить весь код
$name
$serial
$code
Есть ли возможность вывода в одну строку, к примеру вот так:
Код: Выделить весь код
$name $serial $code
$name $serial $code
$name $serial $code
$name $serial $code
$name $serial $code
$name $serial $code

Отправлено: 15:11, 15-10-2021 | #8


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


чтобы так выводить надо преобразовывать под определенный формат, для примера чтобы было понятно что я имею ввиду:
Код: Выделить весь код
$hash = [Ordered]@{
  'name'   = 'a', 'b', 'c'
  'serial' = 1, 2, 3
  'code'   = 'i', 'j', 'k'
}

foreach ($i in $hash.GetEnumerator()) {
  '{0,-6}: {1}' -f $i.Name, "$($i.Value)"
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:08, 15-10-2021 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Select-String. Парсинг нескольких значений между наборами символов.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - Распределить значения Select-String по разным переменным. Uragan66 Скриптовые языки администрирования Windows 6 05-12-2019 10:50
PowerShell - HDD/SSD S.M.A.R.T. - парсинг RAW-значений атрибутов. rango13 Скриптовые языки администрирования Windows 3 02-07-2018 12:52
PowerShell - [решено] Select-String $? всегда True Elven Скриптовые языки администрирования Windows 1 09-04-2018 16:33
[решено] Разница между импульсным и тоновым наборами номеров Казбек Хочу все знать 10 02-06-2012 11:30
PowerShell - [блог] Регулярные выражения – Select-String Xaegr Скриптовые языки администрирования Windows 0 28-12-2009 18:30




 
Переход