使用Powershell在某些文本后提取剩余的行

时间:2016-04-18 23:09:44

标签: string powershell

我有一个带有LexisNexis搜索头条新闻的文本文件。我想从每个条目中提取标题,该条目出现在字符串" HEADLINE:"之后。在文件中,并使用PowerShell将其附加到另一个文本文件。我正在使用这一行:

select-string -path "C:\Users\WGA\Documents\Personal\ANTH_5330\Content_Analysis\Newspaper_Stories,_Combined_Papers2016-04-18_17-59.txt" -Pattern "HEADLINE: " | select line | out-file C:\Users\WGA\Documents\Personal\ANTH_5330\Content_Analysis\Headlines.txt -append

它有点工作,我希望改善输出。我链接到下面的两个文件(一个是要搜索的文件,另一个是输出):

https://drive.google.com/folderview?id=0Byxg512qAqFgU0JrRTNUbVlkeGs&usp=sharing

我愿意提出改进此输出的建议,理想情况下,我希望每个标题只有一行在输出文件中。

2 个答案:

答案 0 :(得分:1)

让我们使用正则表达式来获得我们想要的东西,仅此而已。 Select-String返回包含您要查找的大部分信息的匹配信息对象,包括捕获组。了解对象属性肯定有帮助。我假设你有这个PowerShell 2.0,所以它更冗长,但同样有效。

$path = "D:\Downloads\Newspaper_Stories,_Combined_Papers2016-04-18_17-59.TXT"
Get-Content $path | Out-String | Select-String -Pattern "(?smi)HeadLine: (.*?)`r`n`r`n" -AllMatches |
    Select-Object -ExpandProperty Matches | 
    ForEach-Object{$_.Groups[1]} | 
    ForEach-Object{$_.Value -replace "`r`n"," "} |
    Set-Content $outputFile

我们在文件中读取一个大字符串。这就是Out-String的用途。我们这样做是因为你的一些头条新闻占据了多条线。找到每一行都有"标题"然后在冒号空间之后抓住所有内容直到第一组换行符。我们要查找的文本位于捕获组(.*?)内。接下来,我们必须扩展匹配对象以进入组。使用每个我们获得包含我们捕获的组文本的第二组。每个换句号用空格替换所有换行符,以便标题在输出中显示为一行。

我注意到你的输出文件有额外的空格。这是因为Out-File的默认编码是Unicode。使用Set-Content意味着您不必担心这一点。

另一件事。如果我错了,你更喜欢你所拥有的,你至少可以通过更改select语句来跳过输出文件的标题-ExpandProperty

示例输出

Charter Schools Fall Short In Public Schools Matchup
State's charter schools buck trend Students at the 108 charters in Colorado have scored higher on state assessment tests than their peers in traditional public schools.
Bills would bypass districts to create charter schools
EDITORIAL The reality of charter schools
EDITORIAL Learning more about charters As Colorado and the nation gain more experience with charter schools, we're discovering that results are mixed-- not unlike public schools.
SPEAK OUT;2 studies, 2 views of charter schools
... output truncated. 

答案 1 :(得分:0)

试试这个

Get-Content c:\temp\stories.txt | ? {$_.startswith('HEADLINE: ')} | % {$_.substring(10)} | Out-File c:\temp\headlines.txt -enc ascii