从列表中匹配文件中的行

时间:2015-08-25 16:43:33

标签: powershell

我有两个文本文件,Text1.txt和Text2.txt

Text2.txt是一个关键字列表,每行一个关键字。我想从Text1.txt中读取,并且只要Text2.txt列表中的关键字出现,将整行文本传输到新文件output.txt

在不使用Text2.txt的情况下,我想出了如何在PowerShell中手动完成。

Get-Content .\Text1.txt | Where-Object {$_ -match 'CAPT'} | Set-Content output.txt

这似乎有效,它搜索“CAPT”并返回整行文本,但我不知道如何用从Text2.txt中提取的变量替换手动文本搜索

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用一些简单的正则表达式,您可以从文件Text2.txt中的所有关键字创建一个替代匹配字符串

$pattern = (Get-Content .\Text2.txt | ForEach-Object{[regex]::Escape($_)}) -Join "|"
Get-Content .\Text1.txt | Where-Object {$_ -match $pattern} | Set-Content output.txt

如果您的关键字具有特殊的正则表达式字符,我们需要确保它们在此处转义。 .net正则表达式方法Escape()处理它。

对于大型文件,这不是一种有效的方法,但它肯定是一种简单的方法。如果您的关键字与CAPT CAPS CAPZ类似,那么我们可以对其进行改进,但根据关键字的变化频率,我认为这不值得。

更改模式

如果你想只匹配输入文件中行的前4个字符,那只是在循环中进行更改。

$pattern = (Get-Content .\Text2.txt | ForEach-Object{[regex]::Escape($_.Substring(0,4))}) -Join "|"