如何使用sed查找行及其下一行

时间:2019-07-16 09:08:46

标签: sed

我想获得以“ Xboy”开头的行以及其后以“ +”开头的行。如何通过使用sed来做到这一点?

输入如下所示:

Xapple

+apple1

+apple2

.ends

Xboy

+boy1

+boy2

V2

Xcat

+cat1

+cat2

Xcat

输出应如下所示:

Xboy

+boy1

+boy2

3 个答案:

答案 0 :(得分:1)

这将完成sed中的工作,但实际上此问题比sed所要解决的问题更复杂。使用perlpython会更好。

$ 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 = <>;
    }
}

在Python中:

import fileinput

lines = fileinput.input()

line = lines.readline()
while line != '':
    line = line.rstrip('\n')
    if line == 'Xboy':
        print(line)
        line = lines.readline()
        while line != '' and line.startswith('+'):
            print(line, end='')
            line = lines.readline()
    else:
        line = lines.readline()

答案 1 :(得分:0)

awk版本

awk '/Xboy/ {f=1;print;next} {/^+/?a=1:f=0} a&&f' file
Xboy
+boy1
+boy2

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed -n ':a;/Xboy/{:b;p;n;/^+/bb;ba}' file

如果一行包含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