如何使用sed查找行及其后续行

如何使用sed查找行及其后续行,sed,Sed,我想得到以“Xboy”开头的行,以及以下以“+”开头的行。如何使用sed实现这一点 输入如下所示: Xapple +apple1 +apple2 .ends Xboy +boy1 +boy2 V2 Xcat +cat1 +cat2 Xcat Xboy +boy1 +boy2 输出应如下所示: Xapple +apple1 +apple2 .ends Xboy +boy1 +boy2 V2 Xcat +cat1 +cat2 Xcat Xboy

我想得到以“Xboy”开头的行,以及以下以“+”开头的行。如何使用sed实现这一点

输入如下所示:

Xapple

+apple1

+apple2

.ends

Xboy

+boy1

+boy2

V2

Xcat

+cat1

+cat2

Xcat
Xboy

+boy1

+boy2
输出应如下所示:

Xapple

+apple1

+apple2

.ends

Xboy

+boy1

+boy2

V2

Xcat

+cat1

+cat2

Xcat
Xboy

+boy1

+boy2

这将在
sed
中完成工作,但实际上,这个问题比
sed
所要解决的问题更复杂。您最好使用
perl
python

$ cat foo.txt
Xapple
+apple1
+apple2
.ends
Xboy
+boy1
+boy2
V2
Xcat
+cat1
+cat2
Xcat
$ sed ':section;/Xboy/!d;:plusline;n;/^+/b plusline;b section' foo.txt
Xboy
+boy1
+boy2
在适当的编程语言中,数据的嵌套循环结构变得更加清晰,我们可以更加确信没有忘记的边缘情况

在Perl中:

my $line = <>;
while (defined($line)) {
    chomp($line);
    if ($line eq "Xboy") {
        print $line, "\n";
        $line = <>;
        while (defined($line) && $line =~ /^\+/) {
            print $line;
            $line = <>;
        }
    }
    else {
        $line = <>;
    }
}

awk
版本

awk '/Xboy/ {f=1;print;next} {/^+/?a=1:f=0} a&&f' file
Xboy
+boy1
+boy2
这可能适用于您(GNU-sed):

如果一行包含
Xboy
,则打印该行,并打印以
+
开头的任何后续行,否则保持静默

我猜这是您的意图,但是您可能意味着以非单词字符开头的其他行也应该被忽略,请使用:

sed -n ':a;/Xboy/{:b;p;:c;n;/^+/bb;/^\W/bc;ba}' file 
或者你的意思是:

sed -n ':a;/Xboy/{:b;p;:c;n;/^+/bb;/^[^[:upper:]]/bc;ba}' file
可能您只想打印
Xboy
,如果后面有一行以
+
开头,则使用:

sed -n ':a;/Xboy/{$d;h;:b;n;/^+/{H;$!bb};x;/\n/p;x;ba}' file

我已经更新了@poton的答案,使用了
sed
表格,因为它比我的答案更清晰、更一般!并再次更新以删除
-n
和块语法