如何使用 grep 将文件视为单行以应用正则表达式搜索模式?

如何使用 grep 将文件视为单行以应用正则表达式搜索模式?

我想用正则表达式匹配某些行之间的所有内容,但不匹配开头和结尾的内容。对我来说,这听起来像是积极的后瞻和积极的前瞻

    start text
    bla bla 
    bla
    end

有多个此类块,因此我想提取所有这些块,然后对于每个块,我想根据不同的正则表达式提取一些内容。所以它应该是这样的:

match start 
then match everything until the first occurrence of end
match start 
then match everything until the first occurrence of end

等等...

所以我做了这样的事情:(?<=start).*(?=end)

这不起作用,因为我想我使用命令行 grep,它将文件视为一组行并尝试在每一行中应用正则表达式。有什么方法可以将文件视为整行,或者这不是一个好的解决方案,我必须使用各种命令行工具的组合,例如使用 sed 提取文本,然后构建一个文件,其行包含各行的串联从初始文件?

答案1

由于 a'r 比我先找到了 sed 解决方案,所以我只发布 perl 等效项:

perl -ne 'print if/start/../end/'

不过它有点冗长。

答案2

在这种情况下,您可能会发现 sed 更容易。

sed -ne '/start/,/end/p'

另一种 sed 表达式将匹配的行连接在一起:

sed -ne '/start/ba; be;' \
     -e ':a; N; /end/{s/\n/ /g; p; be;}; ba' \
     -e :e

a如果该行匹配,则第一部分分支到 label /start/,否则分支到e(end)。

第二部分循环遍历行,将它们附加到模式空间,直到/end/找到匹配的行,当它用空格替换新行时,打印该行,然后分支到e(末尾)。

第三部分仅提供标签e

相关内容