在 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----
关于regex - 提取模式之间的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57825722/