我有两个文本文件,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中提取的变量替换手动文本搜索
有什么想法吗?
答案 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 "|"