Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex PowerShell中的正则表达式只匹配行的第一个匹配项_Regex_Powershell_Csv - Fatal编程技术网

Regex PowerShell中的正则表达式只匹配行的第一个匹配项

Regex PowerShell中的正则表达式只匹配行的第一个匹配项,regex,powershell,csv,Regex,Powershell,Csv,我需要构建一个脚本,从各种日志文件中读取数据,并使用powershell将数据放入csv。输出csv应将第一列作为日志文件的名称,第二列应包含日志文件中的某些特定内容。第二列的内容不应在同一文件中出现两次,这就是为什么第一列包含日志文件名的原因。我已成功提取了这两种类型的数据,但仅提取了脚本在将结果放入csv之前,使用正则表达式模式匹配第一个匹配项 我正在使用以下脚本: $test = gc .\datalog.txt | Select-String -Pattern '"\w:\\\w+\\'

我需要构建一个脚本,从各种日志文件中读取数据,并使用powershell将数据放入csv。输出csv应将第一列作为日志文件的名称,第二列应包含日志文件中的某些特定内容。第二列的内容不应在同一文件中出现两次,这就是为什么第一列包含日志文件名的原因。我已成功提取了这两种类型的数据,但仅提取了脚本在将结果放入csv之前,使用正则表达式模式匹配第一个匹配项

我正在使用以下脚本:

$test = gc .\datalog.txt | Select-String -Pattern '"\w:\\\w+\\' -NotMatch |
ForEach-Object {
New-Object psobject -Property @{
D_no = [regex]::Matches($_, '^[^\:]*[^\.log:]')
D_name = [regex]::Matches($_, '((?!\\)\w+\S+(?=\\)|(\w:\w+)[^"])').Groups[1].value
    }
}
$test | Select-Object D_no, D_name | Export-Csv abc.csv -NoTypeInformation
我的脚本中的D_name只匹配行中的第一个匹配项,其中作为我的目标操作是使用D_name中的正则表达式捕获所有条目。但是,当我使用时,正则表达式工作正常

Select-String -allmatches '^[^\:]*[^\.log:]|(?!\\)\w+\S+(?=\\)|(\w:\w+)[^"]').Matches.Value
但这给了我一列数据,包括D_no和D_name。

对于
D\u name
您只提取了一个匹配组-
组[1]。值
。所以这是预期的结果。要将所有匹配结果放入
D_name
,然后将其正确导出到CSV,必须将它们组合成字符串。例如:

New-Object psobject -Property @{
D_no = [regex]::Matches($_, '^[^\:]*[^\.log:]').Value
D_name = ([regex]::Matches($_, '((?!\\)\w+\S+(?=\\)|(\w:\w+)[^"])') | foreach {$_.Value}) -join ','
} 

请注意,从
D_no
的第一个表达式中还可以得到一个MatchCollection,但只包含1个元素。我建议从中获取一个Value属性。

但是现在d_name中的值出现在一行中,而不是每个单元格中的单个值。首先,在你的问题中,你说的是“第二列的内容”。是这样吗?第二,导出csv不支持任意数量的列。它检查管道中的第一个对象,并仅包括所有其他对象的属性。您可以尝试通过将匹配项以逗号分隔的字符串导出到文件(实际上是csv格式)来模拟导出csv