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