如何在 powershell 中使用多行正则表达式从文本文件中提取内容?

How do I extract content from a textfile with multiline regex in powershell?

我有一个名为 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

这可能会做到:

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

您可以使用 switch 语句执行以下操作:

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

这适用于 IP 下列出多个凭据行以及存在多个 IP 和凭据行块的情况。

^192\.168\.1\.\d+$ 匹配仅包含 IP 192.168.1.x 的行,其中 x 是任意数字。 ^\|(.*?:.*?)\x0D 匹配开始一行的 |non-colon chars:non-backslash chars\x0Dnon-colon chars:non-backslash chars 匹配是捕获组 1,在代码中引用为 $matches[1]