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

Regex 正则表达式:提取string1和string2之间的字符串,而string2可以是许多字符串中的一个,regex,shell,unix,awk,extract,Regex,Shell,Unix,Awk,Extract,我得到了多个类似于字典条目的文本文件。一个这样的文本文件可以如下所示: MEANING: content1 content2 IDIOM: content3 content4 MEANING: content1 content2 SYNONYMS: content2 content3 content5 另一种可能是这样的: MEANING: content1 content2 IDIOM: content3 content4 MEANING: content1 content2 SYNON

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

MEANING:
content1
content2
IDIOM:
content3
content4
MEANING:
content1
content2
SYNONYMS:
content2
content3
content5
另一种可能是这样的:

MEANING:
content1
content2
IDIOM:
content3
content4
MEANING:
content1
content2
SYNONYMS:
content2
content3
content5
现在我希望使用一个sed命令行提取“means”部分的内容。 下面是我对第一个文本文件的想法,其中“成语”位于“意思”部分之后:

问题是,输出是:

MEANING:
content1
content2
IDIOM:
content3
然而,这甚至还不起作用,即使用户“Brian Campbell”对此线程中的其他值建议了完全相同的行:

我的第二个问题是对第二个文件执行此操作,其中“同义词”位于“含义”部分之后。从技术上讲,我可以做与上面相同的事情,但是使用“/同义词”而不是“/习语”。然而,这样的事情难道不可能吗

免责声明:它在idea中,语法可能完全错误,我为此提前表示歉意T.T

cat anydicentry.txt | sed -e 's/MEANING\(.*\)\(IDIOM|SYNONYM\)/\1/') 
这一行要做的是把“意思”之后的所有内容复制到出现“成语”或“同义词”的地方。然而,我仍然无法让它工作,我不知道如何实现它

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


提前谢谢你们,伙计们

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

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

请注意,使用两个输入文件检索相同的输出

说明:

  • /^(惯用词|同义词)/{p=0}
    :当行以
    惯用词
    同义词
    开头时,重置标志
    p=0
  • p:当
    p==1
    时,打印每行(默认操作)
  • /^means/{p=1}
    :当行以
    means
    开头时,设置一个标志
    p=1
输出:

content1 content2 内容1 内容2
sed-e的/meansion\(.*\)IDIOM/\1/'
如果您在一行上有
意思,则可以使用IDIOM
<默认情况下,code>sed
仅在一行上搜索。很抱歉响应太晚,非常感谢您的回答!有没有一种方法可以用sed代替awk呢?可以用
sed
来完成,正如你在Cyrus发布的答案中看到的那样。尽管如您所见,使用
awk
更为直接。 content1 content2