我想获得以“ Xboy”开头的行以及其后以“ +”开头的行。如何通过使用sed来做到这一点?
输入如下所示:
Xapple
+apple1
+apple2
.ends
Xboy
+boy1
+boy2
V2
Xcat
+cat1
+cat2
Xcat
输出应如下所示:
Xboy
+boy1
+boy2
答案 0 :(得分:1)
这将完成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 = <>;
}
}
在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