如何使用sed查找行及其后续行
我想得到以“Xboy”开头的行,以及以下以“+”开头的行。如何使用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
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
和块语法