regex - 提取模式之间的内容
问题描述
在 SUSE Linux 上,我想从文本文件中找到 BEGIN 字符串和 END 字符串之间的完整部分。我考虑过使用 sed 或 awk。
或者,我想在另一次运行中搜索下一次出现。
- 它应该成为 bash 脚本的一部分
- 结果应写入文件
我的挑战是:
- BEGIN 字符串在 END 字符串到来之前的开头多次出现
- BEGIN 字符串有时在同一行之前有其他字符
- END 字符串有时在同一行后有其他字符
例子
something before ----BEGIN
first paragraph
Text Text Text
Text Text Text
Text Text Text
no ending pattern
something before ----BEGIN
second paragraph
Text Text Text
Text Text Text
Text Text Text
END---- some more text
no beginning pattern
Text Text Text
Text Text Text
END---- some more text
something before ----BEGIN
third paragraph
Text Text Text
Text Text Text
Text Text Text
no ending pattern
something before ----BEGIN
fourth paragraph
Text Text Text
Text Text Text
Text Text Text
END---- some more text
Text Text Text
我期待这样的事情:
----BEGIN
second paragraph
Text Text Text
Text Text Text
Text Text Text
END----
在另一次运行中,我想找到下一个完整部分:
----BEGIN
fourth paragraph
Text Text Text
Text Text Text
Text Text Text
END----
在论坛中,我已经可以找到这样的东西:
tac < file.txt | sed '/END-----/,$!d;/-----BEGIN/q' | tac
但它只找到最后一次出现,并且不会剪切开头和结尾的字符。
不幸的是,我在使用 sed/awk 或正则表达式方面经验不足。如果您能给我一些指导,我将不胜感激!
干杯,呃
解决方案
$ cat tst.awk
BEGIN { beg="----BEGIN"; end="END----" }
sub(".*"beg,beg) { inBlock=1; buf="" }
inBlock {
buf = buf $0 ORS
if ( sub(end".*",end,buf) ) {
print buf ORS
inBlock=0
}
}
$ awk -f tst.awk file
----BEGIN
second paragraph
Text Text Text
Text Text Text
Text Text Text
END----
----BEGIN
fourth paragraph
Text Text Text
Text Text Text
Text Text Text
END----
推荐阅读
- scala - 转移到 Spark 以获取大数时失去精度
- heroku - Flask 应用程序在本地运行,但在 Heroku 上无法渲染模板?
- python-3.x - 给定一个非负整数 num,重复添加它的所有数字,直到结果只有一个数字
- python - 如何提高从 ftp 服务器下载数据的速度?
- scala - 在 expect() 中看到错误值时如何生成 [error] 而不是 [info]
- php - 按顺序创建标识号,并将范围划分为寄存器
- python - youtube-dl 前端视频下载 - 使用 python 和烧瓶?
- javascript - 通过正则表达式从 JavaScript 中提取变量而不是函数
- javascript - 如何搜索
在Javascript中通过id作为条件,然后在另一个中输出文本
?
- javascript - 从数据表中提取渲染的单元格数据