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

时间:2018-06-16 17:57:49

标签: regex shell unix awk extract

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

MEANING:
content1
content2
IDIOM:
content3
content4

另一个可以是这样的:

MEANING:
content1
content2
SYNONYMS:
content2
content3
content5

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

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

事情是,输出是:

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\)/\1/') 

这一行的目的是将“意义”之后的所有内容复制到“IDIOM”或“SYNONYMS”出现的位置。但是,我仍然无法使其工作,我不知道如何实现它。

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

先谢谢你,伙计们!

2 个答案:

答案 0 :(得分:2)

对于像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

答案 1 :(得分:0)

sed -n '/^MEANING:$/,/^[A-Z]*:$/{/^MEANING:$/d;/^[A-Z]*:$/d;p}' file

输出:

content1
content2