Извлечь часть предложения из текстового файла

У меня есть неудобный текстовый файл (hosts.txt), мне нужно извлечь определенную часть предложения из: -

18 Jul 2019 09:30 BST
62.172.169.12
United Kingdom 
H82640A745.XGPH82640
3.12.21.0
Remove
18 Jul 2019 09:29 BST
62.172.169.9
United Kingdom 
H82640A744.XGPH82640
3.12.21.0
Remove
18 Jul 2019 09:26 BST
62.172.169.18
United Kingdom 
H82640A740.XGPH82640
3.12.21.0
Remove

Мне просто нужен номер H ********** рядом с .XGPH82640 - поэтому из примера мне просто нужен список вроде: -

H82640A745
H82640A744
H82640A740

и так далее...

Я пытаюсь извлечь, используя токены и разделители в пакетном режиме, но я ничего не получаю. Если я попытаюсь и Skip=X количество строк, это не сработает, потому что первое число H******* имеет три строки выше, но с тех пор имеет 5.

Я прочитал SS64 о токенах и делимах, так как мне бы очень хотелось разобраться в этом самостоятельно, но я не понимаю. Особенно с этим текстовым файлом.

В данный момент я пытаюсь использовать «:» в качестве разделителя, но опять же номера токенов меняются, поэтому, если это были только первые пять строк

For /F "Tokens=4 delims=:" %%A In (hosts.txt) Do echo %%A

Любая помощь будет здорово - спасибо!


person Tika9o9    schedule 18.07.2019    source источник
comment
…или аналогично: @(If Exist "hosts.txt" For /F "Delims=" %%A In ('""%__AppDir__%findstr.exe" /LIE ".XGPH82640" "hosts.txt""')Do @Echo(%%~nA)&Pause.   -  person Compo    schedule 18.07.2019
comment
@Compo, хороший. Также поймал бы префикс с дополнительными точками. Комбинированный: for /f "delims=" %%A in ('findstr /EC:".XGPH82640" hosts.txt 2^>NUL') Do @Echo(%%~nA   -  person    schedule 18.07.2019
comment
Спасибо! Что будет, если XGPH82640 станет чем-то другим - как получится, но формат файла будет тот же - спасибо   -  person Tika9o9    schedule 18.07.2019
comment
@ Tika9o9, пожалуйста, посмотрите мой ответ, чтобы найти потенциальное решение для этого.   -  person Compo    schedule 18.07.2019


Ответы (2)


Этот ответ основан на моем комментарии и вашем последующем предположении, что строки могут содержать неизвестную буквенно-цифровую строку, разделенную точкой, вместо известной:

Из пакетный файл:

@Echo Off
If Not Exist "hosts.txt" GoTo :EOF
For /F "Delims=" %%A In (
    '""%__AppDir__%findstr.exe" /X "^[A-Z0-9]*\.[A-Z0-9]*$" "hosts.txt""'
) Do Echo %%~nA
Pause

Непосредственно в cmd:

For /F "Delims=" %A In ('""%__AppDir__%findstr.exe" /X "^[A-Z0-9]*\.[A-Z0-9]*$" "hosts.txt" 2>NUL"')Do @Echo %~nA
person Compo    schedule 18.07.2019

Вы можете использовать следующую командную строку в своем командном файле:

for /F "tokens=1,2 delims=." %%I in (hosts.txt) do if "%%J" == "XGPH82640" echo %%I

FOR читает файл hosts.txt построчно, игнорируя пустые строки.

Разделитель строк изменяется с помощью delims=. вместо обычного пробела или горизонтальной табуляции по умолчанию на символ ..

Для этой задачи представляют интерес строки, которые имеют две подстроки, разделенные точками, причем вторая подстрока должна быть XGPH82640. По этой причине tokens=1,2 используется для получения первой строки, разделенной точками, назначенной переменной цикла I, и второй строки, разделенной точками, назначенной следующей переменной цикла, которая равна J в соответствии с таблица ASCII.

Если первая подстрока после удаления всех ведущих . будет начинаться с точки с запятой, команда FOR также проигнорирует строку, поскольку eol=; является символом конца строки по умолчанию. Но можно предположить, что ни одна строка с XGPH82640 не начинается с ;, и поэтому символ конца строки по умолчанию можно оставить как есть.

Условие IF с учетом регистра проверяет, является ли вторая строка, разделенная точкой, действительно XGPH82640, а не пустой строкой, как в строках с датой/временем или страной и/или десятичным числом, как в строках с IPv4-адрес.

При истинном условии IF первая строка, разделенная точкой, выводится на консоль.

person Mofi    schedule 18.07.2019