在PowerShell中使用正则表达式搜索多个单词

时间:2014-05-21 14:13:44

标签: regex powershell

我是PowerShell的新手。我非常感谢您为以下提供的任何帮助。我有一个powershell脚本,但无法完成从文本文件中获取所有数据字段。

我有一个文件1.txt,如下所示。

我正在尝试从下面的表格格式的文件中提取“pid”和“ctl00_lblOurPrice”的输出,以便我可以在excel中打开它。列标题并不重要。 :

pid ctl00_lblOurPrice

0070362408 $ 6.70

008854787666 $ 50.70

目前我只能获得以下pid。想得到每个pid的价格。 - >

0070362408

008854787666

C:\扫描\ 1.txt的:

This is sentence 1.. This is sentence 1.1... This is sentence A1...
fghfdkgjdfhgfkjghfdkghfdgh gifdgjkfdghdfjghfdg
gkjfdhgfdhgfdgh
ghfghfjgh
...
href='http://example.com/viewdetails.aspx?pid=0070362408'>
This is sentence B1.. This is sentence B2... This is sentence B3...
GFGFGHHGH
HHGHGFHG
<p class="price" style="display:inline;">
ctl00_lblOurPrice=$6.70
This is sentence 1.. This is sentence 1.1... This is sentence A1...
fghfdkgjdfhgfkjghfdkghfdgh gifdgjkfdghdfjghfdg
gkjfdhgfdhgfdgh
ghfghfjgh
...
href='http://example.com/viewdetails.aspx?pid=008854787666'>
This is sentence B1.. This is sentence B2... This is sentence B3...
6GBNGH;L
887656HGFHG
<p class="price" style="display:inline;">
ctl00_lblOurPrice=$50.70
...
...

当前的powershell脚本:

$files=Get-ChildItem c:\scan -recurse
$output_file = ‘c:\output\outdata.txt’ 
foreach ($file in $files) {
    $input_path = $file 
    $regex = ‘num=\d{1,13}’ 
    select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % {
    ($_.Value) -replace "num=","" } | Out-File $output_file -Append }

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我将假设您在代码中表示pid=\d{1,13},或者您的示例文本应该是num=而不是pid=。我们将假设它实际上应该是pid

在这种情况下,我们将整个文件转换为一个带有-Join ""的长字符串,然后将其拆分为&#34; href&#34;为每个要解析的站点创建记录。然后我们匹配pid =并在遇到非数字字符时结束,然后我们查找一个美元金额($后跟一个数字,然后是一个句点,然后是另外两个数字)。

当我们有一对PID /价格匹配时,我们可以创建一个具有两个属性PID和Price的对象,并输出它。为此,我将它分配给一个数组,以便以后使用。如果您没有PSv3或更高版本,则必须将[PSCustomObject][ordered]更改为New-Object PSObject -Property,但这会失去属性的顺序,所以我更喜欢前者,并在我的示例中使用它。

$files=Get-ChildItem C:\scan -recurse
$output_file = 'c:\output\outdata.csv'
$Results = @()
foreach ($file in $files) {
    $Results += ((gc $File) -join "") -split "href" |?{$_ -match "pid=(\d+?)[^\d].*?(\$\d*?\.\d{2})"}|%{[PSCustomObject][ordered]@{"PID"=$Matches[1];"Price"=$Matches[2]}}
}

$Results | Select PID,Price | Export-Csv $output_file -NoTypeInformation