Bash Sed删除2个模式之间的所有内容,但不包括模式

Bash Sed删除2个模式之间的所有内容,但不包括模式,bash,sed,bsd,Bash,Sed,Bsd,我已经找到了一些关于这方面的例子,但没有一个能完全符合我的要求 我想删除介于1和其他几种可能模式之间的所有内容,但不包括模式本身。图案对仅为每行,而不是跨多行 乙二醇 到 因此,第一个匹配的模式是“:”,第二个是“棕色”或“猫”或“黄色”暴力和无知有时很有效: sed -e 's/^:.* Brown/:Brown/' \ -e 's/^:.* Cat/:Cat/' \ -e 's/^:.* Yellow/:Yellow/' \ data-file.txt 您可以将“扩

我已经找到了一些关于这方面的例子,但没有一个能完全符合我的要求

我想删除介于1和其他几种可能模式之间的所有内容,但不包括模式本身。图案对仅为每行,而不是跨多行

乙二醇


因此,第一个匹配的模式是“:”,第二个是“棕色”或“猫”或“黄色”

暴力和无知有时很有效:

sed -e 's/^:.* Brown/:Brown/' \
    -e 's/^:.* Cat/:Cat/' \
    -e 's/^:.* Yellow/:Yellow/' \
    data-file.txt
您可以将“扩展正则表达式”与
-E
(BSD、Mac、Linux)或
-r
(仅限Linux)选项一起使用:

两者都会对样本数据产生所需的输出

请注意,使用的
*
是“贪婪的”。给定输入文件:

:1543453 Brown Fox
:789 123456 Cat
:abcdef Yellow Duck
:quantum mechanics eat Yellow Ducks for being yellow (but leave Yellow Dafodils alone)
这两个脚本都会生成:

:Brown Fox
:Cat
:Yellow Duck
:Yellow Dafodils alone)
您需要Perl或使用PCRE(Perl兼容的正则表达式)增强的
sed
,或其他一些程序,以避免贪婪。例如:

$ perl -n -e 'print if s/^:.*? (Brown|Cat|Yellow)/:\1/' data-file.txt
:Brown Fox
:Cat
:Yellow Duck
:Yellow Ducks for being yellow (but leave Yellow Dafodils alone)
$

我不确定这些模式是否已修复。可能使用
pat1=“:”;pat2=“(猫黄色|棕色)”;sed-r“s/(${pat1})。*(${pat2})/\1\2/”inputfile
@WalterA:从长远来看,有无数类似的可能性。我处理提出的问题是因为试图猜测哪些替代方案是相关的问题太多了。将正则表达式作为参数引用是很棘手的,但要小心操作。(是的,在替换模式中重复
不一定是最好的技术;在替换中使用捕获并引用它更为普遍。您可以使用
sed-E/(棕色|猫|黄色)来消除贪婪(当模式2在模式1之后)/\x01\1/;s/^:.*\x01/:/'data file.txt
。感谢您的回复。我正在努力让它正常工作。不确定这是否是因为我在bash脚本的BSD中。我是新手,正在学习。好的。我使用Mac(BSD)
sed
测试了我在运行macOS 10.13.4的Mac上显示的片段。
:1543453 Brown Fox
:789 123456 Cat
:abcdef Yellow Duck
:quantum mechanics eat Yellow Ducks for being yellow (but leave Yellow Dafodils alone)
:Brown Fox
:Cat
:Yellow Duck
:Yellow Dafodils alone)
$ perl -n -e 'print if s/^:.*? (Brown|Cat|Yellow)/:\1/' data-file.txt
:Brown Fox
:Cat
:Yellow Duck
:Yellow Ducks for being yellow (but leave Yellow Dafodils alone)
$