Powershell Select-String在1行中输出为CSV

时间:2019-03-03 05:51:29

标签: regex powershell select-string export-csv

我正在尝试将Select-String的输出放到一行而不是多行中,但是似乎无法使我的头脑不变。

这是我的输入字符串和一个非常简单的模式,用于在'='之后提取数据,

'trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | % { $_.Matches } | % { $_.Value.SubString(1) }

但不是将搜索的每个模式的输出显示在单独的行中,

0FWEB8

030119

075257

671442647590

184

21

24229

9777A611236814D8

04

PT

TestB82PTResponseTags

00

0FWEB8

24

我正在尝试将输出显示为CSV,这意味着在一行中显示类似这样的内容

0FWEB8, 030119, 075257, 671442647590, 184, 21, 24229, 9777A611236814D8, 04, PT, TestB82PTResponseTags, 00, 0FWEB8, 24

尝试使用到Export-CSV的管道,但失败了。 语法应该是什么?我相信它很简单,但似乎无法使我理解。

4 个答案:

答案 0 :(得分:0)

在此可以根据用例使用-Join。

about_Join | Microsoft Docs

所以,你的意思是这个...

Clear-Host
('trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' | 
select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | 
% { $_.Matches } | 
% { $_.Value.SubString(1) }) -join ', '

# Results
0FWEB8, 030119, 075257, 671442647590, 184, 21, 24229, 9777A611236814D8, 04, PT, TestB82PTResponseTags, 00, 0FWEB8, 24

答案 1 :(得分:0)

您可以将结果添加到import torch arr=torch.tensor([[1,2],[4,5],[7,8]]) indices_arr=torch.tensor([0,1,0]) ret=arr[[0,1,2],indices_arr] # print(ret) # tensor([1, 5, 7]) ,然后使用ArrayList运算符获取所需的输出

-join

输出:

$values = New-Object System.Collections.ArrayList; 'trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | % { $_.Matches } | % { $values.Add($_.Value.SubString(1)) > $null }; $values -join ","

答案 2 :(得分:0)

您可以编写一些简单的方法,如下所示。

"REFNO=0FWEB8,STRTDATE=030119" | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | foreach { $_.Matches.Value.SubString(1) -join ", " }

答案 3 :(得分:0)

我不认为我提供了原创作品,但是为什么不尝试呢?

@('trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' |
Select-String -Pattern '(?<==)[^,]+' -AllMatches | Select-Object -ExpandProperty Matches | ForEach-Object Value) -join ','

[regex]::Matches('trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]', '(?<==)[^,]+').ForEach({$_.Value}) -join ','

输出:

0FWEB8,030119,075257,671442647590,184,21,24229,9777A611236814D8,04,PT,TestB82PTResponseTags,00,0FWEB8,24