Powershell 搜索直到下一个模式
Powershell search until next pattern
我正在尝试解析 .txt 文件。示例内容如下。
这是我到目前为止完成的代码。我的意图是:
如果行匹配 '-----STRING (S) FOUND ------' 则在 $string1 中获取第 3 列到第 11 列中的字符串。
然后直到下一个 '--------STRING FOUND----',匹配是否存在 '.COM'。
最终输出如下:
MEM1 .COM
MEM2 .COM
$foundCall = $false
$string1 = $null
# Script to find email
gc "D:\download\yoghaem2.txt" | % {
if ($_ -match '----------- STRING(S) FOUND -------------------')
{
$string1 = ^(.{8}) # 3 to 11 column
}
elseif ($string1 -ne $null) {
if ($_ -match "\.com") { $foundCall = $true }
}
}
if ($foundCall) {$string1}
MEM1 CONCAT#(7) ----------- STRING(S) FOUND -------------------
82 // PARM=('%@ M=TEMPMSL ROMSL=(MSLPRO,MSLSYS)',
83 // '@% CMD="GENERATE MEMBER(&NAME) SYSTEM(.COM/OS)"')
97 // PARM=('%@ DSN SYSTEM (&DB.&TO)',
98 // '@% RUN PROGRAM(DCGBINIT) PLAN(DCGV330)',
99 // '@ LIB(''&CSPNODV..AELOAD'')',
MEM2 CONCAT#(7) ----------- STRING(S) FOUND -------------------
63 // PARM=('%@ M=TEMPMSL ROMSL=(MSLPRO,MSLSYS)',
64 // '@% CMD="EXPORT MEMBER(&NAME)',
65 // '@ TARGET(&XNAME) TYPE(.COM)"')
MEM3 CONCAT#(7) ----------- STRING(S) FOUND -------------------
使用 Switch,猜猜你想要什么。
#Create test file
(@'
MEM1 CONCAT#(7) ----------- STRING(S) FOUND -------------------
82 // PARM=('%@ M=TEMPMSL ROMSL=(MSLPRO,MSLSYS)',
83 // '@% CMD="GENERATE MEMBER(&NAME) SYSTEM(.COM/OS)"')
97 // PARM=('%@ DSN SYSTEM (&DB.&TO)',
98 // '@% RUN PROGRAM(DCGBINIT) PLAN(DCGV330)',
99 // '@ LIB(''&CSPNODV..AELOAD'')',
MEM2 CONCAT#(7) ----------- STRING(S) FOUND -------------------
63 // PARM=('%@ M=TEMPMSL ROMSL=(MSLPRO,MSLSYS)',
64 // '@% CMD="EXPORT MEMBER(&NAME)',
65 // '@ TARGET(&XNAME) TYPE(.COM)"')
MEM3 CONCAT#(7) ----------- STRING(S) FOUND -------------------
'@).split("`n") |
foreach {$_.trim()} | Set-Content testfile.txt
#Script starts here:
Switch -File ./testfile.txt -Wildcard
{
'*----------- STRING(S) FOUND -------------------*'
{
$result = [PSCustomObject]@{
Mem = $_ -replace '^(\S+).+',''
Found = $null
}
}
'*.com*'
{
$result.found = '.COM'
$result
}
}
Mem Found
--- -----
MEM1 .COM
MEM2 .COM
我正在尝试解析 .txt 文件。示例内容如下。
这是我到目前为止完成的代码。我的意图是:
如果行匹配 '-----STRING (S) FOUND ------' 则在 $string1 中获取第 3 列到第 11 列中的字符串。
然后直到下一个 '--------STRING FOUND----',匹配是否存在 '.COM'。
最终输出如下:
MEM1 .COM
MEM2 .COM
$foundCall = $false
$string1 = $null
# Script to find email
gc "D:\download\yoghaem2.txt" | % {
if ($_ -match '----------- STRING(S) FOUND -------------------')
{
$string1 = ^(.{8}) # 3 to 11 column
}
elseif ($string1 -ne $null) {
if ($_ -match "\.com") { $foundCall = $true }
}
}
if ($foundCall) {$string1}
MEM1 CONCAT#(7) ----------- STRING(S) FOUND -------------------
82 // PARM=('%@ M=TEMPMSL ROMSL=(MSLPRO,MSLSYS)',
83 // '@% CMD="GENERATE MEMBER(&NAME) SYSTEM(.COM/OS)"')
97 // PARM=('%@ DSN SYSTEM (&DB.&TO)',
98 // '@% RUN PROGRAM(DCGBINIT) PLAN(DCGV330)',
99 // '@ LIB(''&CSPNODV..AELOAD'')',
MEM2 CONCAT#(7) ----------- STRING(S) FOUND -------------------
63 // PARM=('%@ M=TEMPMSL ROMSL=(MSLPRO,MSLSYS)',
64 // '@% CMD="EXPORT MEMBER(&NAME)',
65 // '@ TARGET(&XNAME) TYPE(.COM)"')
MEM3 CONCAT#(7) ----------- STRING(S) FOUND -------------------
使用 Switch,猜猜你想要什么。
#Create test file
(@'
MEM1 CONCAT#(7) ----------- STRING(S) FOUND -------------------
82 // PARM=('%@ M=TEMPMSL ROMSL=(MSLPRO,MSLSYS)',
83 // '@% CMD="GENERATE MEMBER(&NAME) SYSTEM(.COM/OS)"')
97 // PARM=('%@ DSN SYSTEM (&DB.&TO)',
98 // '@% RUN PROGRAM(DCGBINIT) PLAN(DCGV330)',
99 // '@ LIB(''&CSPNODV..AELOAD'')',
MEM2 CONCAT#(7) ----------- STRING(S) FOUND -------------------
63 // PARM=('%@ M=TEMPMSL ROMSL=(MSLPRO,MSLSYS)',
64 // '@% CMD="EXPORT MEMBER(&NAME)',
65 // '@ TARGET(&XNAME) TYPE(.COM)"')
MEM3 CONCAT#(7) ----------- STRING(S) FOUND -------------------
'@).split("`n") |
foreach {$_.trim()} | Set-Content testfile.txt
#Script starts here:
Switch -File ./testfile.txt -Wildcard
{
'*----------- STRING(S) FOUND -------------------*'
{
$result = [PSCustomObject]@{
Mem = $_ -replace '^(\S+).+',''
Found = $null
}
}
'*.com*'
{
$result.found = '.COM'
$result
}
}
Mem Found
--- -----
MEM1 .COM
MEM2 .COM