Как извлечь содержимое из текстового файла с многострочным регулярным выражением в powershell? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть файл с именем list1.txt, который содержит

192.168.1.1

|root:pass\x0Droot\x0Dvizxv\x0Dadmin\x0D888888\x0Dxmhdipc\x0Ddefault\x0Djuantech\x0D123456\x0D54321\x0Dsupport\x0Droot/\x0Dpassword\x0D12345\x0Duser\x0Dadmin/\x0Dpass\x0Dadmin1234\x0D1111\x0Dsmcadmin\x0D666666\x0D1234\x0Dklv123\x0Dservice\x0Dsupervisor\x0Dguest\x0Dubnt\x0Dklv1234\x0DZte521\x0Dhi3518\x0Djvbzd\x0Danko\x0Dzlxx.\x0D7ujMko0vizxv\x0D7ujMko0admin\x0Dsystem\x0Dikwb\x0Ddreambox\x0Drealtek\x0D00000000\x0D1111111\x0Dmeinsm\x0Dtech\x0Ddefault\x0DS2fGqNFs\x0Dtelnet\x0Dhunt5759\x0DOxhlwSG8\x0Djauntech\x0Dantslq\x0Dusuario\x0Doracle\x0Dtor\x0D1001chin\x0D12341234\x0D20080826\x0D5up\x0D88888888\x0DGM8182\x0DROOT500\x0Dabc123\x0Dahetzip8\x0Dascend\x0Dblender\x0Dcat1029\x0Dchangeme\x0Ddownload\x0Dgrouter\x0Dh3c\x0Dhg2x0\x0Dhuigu309\x0DiDirect\x0Dipcam_rt5350\x0Diwkb\x0Dnflection\x0Dnmgx_wapia\x0Doelinux123\x0Dprivate\x0Dsolokey\x0Dsvgodie\x0Dswsbzkgn\x0Dt0talc0ntr0l4!\x0DtaZz@23495859\x0Dtelecomadmin\x0Dtl789\x0Dtsgoingon\x0Dtwe8ehome\x0Dwin1dows\x0Dxc3511\x0Dzhongxing\x0Dzsun1188\x0Dtelnetadmin\x0D-

Как мне сделать так, чтобы он был отформатирован?

192.168.1.1:root:pass

Ответы [ 2 ]

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

Вы можете сделать следующее с помощью оператора switch:

switch -regex -file list1.txt {
    '^192\.168\.1\.\d+$' { $ip = $_ }
    '^\|(.*?:.*?)\\x0D' { "{0}:{1}" -f $ip,$matches[1] }
}

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

^192\.168\.1\.\d+$ соответствует строкам, которые содержат только IP 192.168.1.x, где x - любое число. ^\|(.*?:.*?)\\x0D соответствует |non-colon chars:non-backslash chars\x0D, начинающему строку. Совпадение non-colon chars:non-backslash chars - это группа захвата 1, которая в коде обозначается как $matches[1].

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

Это может сделать это:

Get-Content .\list1.txt -Raw | Select-String '(?smi)(\d{1,3}(\.\d{1,3}){3})[^\|]*\|(\w+)\:(\w+)' -AllMatches | ForEach-Object {$_.Matches} | ForEach-Object {"$($_.Groups[1].Value):$($_.Groups[3].Value):$($_.Groups[4].Value)"} 

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

192.168.1.1: root: pass

192.168.1.1: root: pass

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