我有多个类似于字典条目的文本文件。一个这样的文本文件可能如下所示:
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”出现的位置。但是,我仍然无法使其工作,我不知道如何实现它。
我希望你能理解我遇到的两个问题。
先谢谢你,伙计们!
答案 0 :(得分:2)
对于像awk
一样逐行处理文件是更好的工具,因为awk
是完整的编程语言。
awk '/^(IDIOM|SYNONYMS)/{p=0} p; /^MEANING/{p=1}' file
content1
content2
请注意,使用两个输入文件检索相同输出。
<强>解释强>
/^(IDIOM|SYNONYMS)/{p=0}
:当行以IDIOM
或SYNONYMS
开头时,重置标记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