正则表达式:提取 string1 和 string2 之间的字符串,而 string2 可以是多个字符串之一

Regex: Extract string between string1 and string2, whereas string2 can be one of many strings

我得到了多个类似于字典条目的文本文件。一个这样的文本文件可能如下所示:

MEANING:
content1
content2
IDIOM:
content3
content4

另一个可以是这样的:

MEANING:
content1
content2
SYNONYMS:
content2
content3
content5

现在我的愿望是使用一个 sed 命令行提取 "MEANING" 部分的内容。 这是我对第一个文本文件的想法,其中 "IDIOM" 在 "MEANING" 部分之后:

cat dicentry1.txt | sed -e 's/MEANING\(.*\)IDIOM//')

事实是,输出是:

MEANING:
content1
content2
IDIOM:
content3

然而,即使用户 "Brian Campbell" 建议与此线程中的其他值完全相同的行,这甚至还行不通:How to use sed/grep to extract text between two words?

我的第二个问题是对第二个文件执行此操作,其中 "SYNONYMS" 位于 "MEANING" 部分之后。从技术上讲,我可以像上面那样做,但使用“/SYNONYMS”而不是“/IDIOM”。但是,这样的事情不可能吗?

免责声明:这是想法,语法可能完全错误,我提前为此道歉T.T

cat anydicentry.txt | sed -e 's/MEANING\(.*\)\(IDIOM|SYNONYM\)//') 

这一行应该做的是将 "MEANING" 之后的所有内容复制到 "IDIOM" 或 "SYNONYMS" 出现的位置。但是,我仍然无法正常工作,我不知道如何实现它。

希望您能理解我遇到的两个问题。

提前致谢各位!

对于像这样逐行处理文件,awk 是更好的工具,因为 awk 是完整的编程语言。

awk '/^(IDIOM|SYNONYMS)/{p=0} p; /^MEANING/{p=1}' file

content1
content2

请注意,相同的输出 与您的两个输入文件一起检索。

解释:

  • /^(IDIOM|SYNONYMS)/{p=0}:当行以 IDIOMSYNONYMS 开始时,然后重置标志 p=0
  • p;:当p==1时则打印每一行(默认动作)
  • /^MEANING/{p=1}:当行以MEANING开始时,设置一个标志p=1
sed -n '/^MEANING:$/,/^[A-Z]*:$/{/^MEANING:$/d;/^[A-Z]*:$/d;p}' file

输出:

content1
content2