【问题标题】:How do I extract select paragraphs that contain a given keyword?如何提取包含给定关键字的选定段落?
【发布时间】:2020-06-12 10:43:58
【问题描述】:

简而言之:我正在寻找与以下 awk 命令等效的 PowerShell:

awk '/keyword/' RS='' ORS='\n\n' input.txt

我的目标是从包含特定关键字的文本中提取选定的段落——不仅仅是包含关键字的行,而是整个段落。

对我的文本文件施加的规则是,每个段落都以特定模式(例如Pa0)开头,该模式仅在段落开头在整个文本中使用。每个段落都以一个额外的换行符结尾。

例如,假设我有以下文本:

Pa0 
This is the first paragraph bla bla bla
This is another line in the same paragraph bla bla 
This is a third line bla bla 

Pa0
This is the second paragraph bla bla bla
Second line bla bla My keyword is here!
bla bla bla 
bla 

Pa0
Hey, third paragraph bla bla bla!
bla bla 

Pa0
keyword keyword
keyword
Another line! bla 

我的目标是提取包含单词keyword 的段落。例如:

Pa0
This is the second paragraph bla bla bla
Second line bla bla My keyword is here!
bla bla bla 
bla 

Pa0
keyword keyword
keyword
Another line! bla 

【问题讨论】:

  • 除了搜索一个单词并在输出中加倍空格之外,我看不到它的作用。
  • 要在 powershell 中使用 bash 命令,请使用 bash -c "command"
  • 好点,@js2010:我已经修复了awk 命令,并且我还恢复了 OP 的原始问题描述,希望能澄清一些事情。
  • @NekoMusume 请注意,标准的awk 实用程序(在类Unix 平台上)与bash 无关,您可以直接从PowerShell 调用awk - 中的命令问题按原样工作。
  • 注意:RS=''(将记录分隔符 RS 设置为 null / 空字符串)是 POSIX 强制要求的,因此 portable awk 成语通过一个或多个空行将输入分成段落;相比之下,RS='\n\n' - 即 多字符 记录分隔符 - 仅受 一些 awk 实现支持,例如 GNU awk

标签: powershell awk


【解决方案1】:

Mathias R. Jessen's helpful answer 提供更简洁、更快捷的替代方案。

(Get-Content -Raw input.txt) -split '\r?\n\r?\n' -match 'keyword'

注意:Regex \r?\n 以与平台无关的方式匹配单个换行符 - 它同时匹配 CRLF 和 LF-only 换行符。如果您只有 LF-only 换行符,\n\n 可以。
要将匹配限制在段落的开头,请使用'^keyword'

  • 这只会按预期将匹配的段落返回为多行字符串的数组,例如,您可以使用ForEach-Object cmdlet 逐一处理.

  • 请注意,如果最后匹配的段落也恰好是文件中的最后一个段落,则它可能有一个尾随换行符。


文档链接:

【讨论】:

    【解决方案2】:

    使用Get-Content -Delimiter 将文件读入块中,然后使用Where-Object 过滤您的关键字:

    $paragraphs = Get-Content .\input.txt -Delimiter "`n`n" |Where-Object { $_ -like '*keyword*' }
    

    如果您正在将现有的自动化从类 unix 操作系统移植到 Windows,您可能会发现使用回车 + 换行符进行换行的惯例会弄乱您的脚本。

    在这种情况下,要么使用"`r`n`r`n" 作为分隔符,要么使用mklement0's excellent regex-based solution(这将考虑到两种换行符格式)

    【讨论】:

      【解决方案3】:

      编辑:

      哦,我明白了,RS="\n\n" 只能在 gnu awk 中工作。我也在这里查看示例 3:8 Powerful Awk Built-in Variables 所以问题之前的阅读方式

      awk '/keyword/' RS="\n\n" ORS="\n\n" input.txt 
      

      在标准 awk 中不起作用。我在osx中​​尝试过。 In awk, why are "" and "\n\n" treated the same for the RS parameter?

      【讨论】:

      • Yes: RS=''(将记录分隔符 RS 设置为 null / 空字符串)是 POSIX 强制要求的,因此 portable awk 成语通过一个或多个空行将输入分成段落;相比之下,RS='\n\n' - 即 多字符 记录分隔符 - 仅受 一些 awk 实现支持,例如 GNU awk。但是,您现在的答案与原始问题几乎没有关系,因此我建议将其删除。
      猜你喜欢
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2015-11-29
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多