【问题标题】:Matching lines in file from list从列表中匹配文件中的行
【发布时间】:2015-11-19 11:42:38
【问题描述】:

我有两个文本文件,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 中提取的变量替换手动文本搜索

有什么想法吗?

【问题讨论】:

  • 您通常会有多少个关键字? 10、100、1000?
  • Text2.txt 中小于 1,000。不过,Text1 可能非常庞大。

标签: powershell


【解决方案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 "|"

【讨论】:

  • 唯一的问题是关键字是否包含|(或其他正则表达式字符)。
  • 感谢@Matt!我不知道Escape() 方法... :)
  • 问题 - 它似乎正在工作,虽然我得到了我没想到的数据。 (这不是脚本的问题,这是我必须使用的愚蠢数据)。有没有简单的方法让它只匹配 Text1.txt 的前四个字符? (仍然将整行文本返回到 output.txt)
  • @WDavis 我做了一个小更新来解决这个请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2019-02-14
  • 1970-01-01
相关资源
最近更新 更多