正则表达式:提取 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}
:当行以 IDIOM
或 SYNONYMS
开始时,然后重置标志 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
我得到了多个类似于字典条目的文本文件。一个这样的文本文件可能如下所示:
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}
:当行以IDIOM
或SYNONYMS
开始时,然后重置标志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